我有一个从数据库ResultSet创建的数组。我正在尝试序列化它,以便我可以通过套接字流发送它。目前我收到一个错误,告诉我该数组不是Serializable。我的代码如下所示,第一部分是为数组创建对象的类:
class ProteinData
{
private int ProteinKey;
public ProteinData(Integer ProteinKey)
{
this.ProteinKey = ProteinKey;
}
public Integer getProteinKey() {
return this.ProteinKey;
}
public void setProteinKey(Integer ProteinKey) {
this.ProteinKey = ProteinKey;
}
}
填充数组的代码:
public List<ProteinData> readJavaObject(String query, Connection con) throws Exception
{
PreparedStatement stmt = con.prepareStatement(query);
query_results = stmt.executeQuery();
while (query_results.next())
{
ProteinData pro = new ProteinData();
pro.setProteinKey(query_results.getInt("ProteinKey"));
tableData.add(pro);
}
query_results.close();
stmt.close();
return tableData;
}
调用它的代码是:
List dataList = (List) this.readJavaObject(query, con);
ObjectOutputStream output_stream = new ObjectOutputStream(socket.getOutputStream());
output_stream.writeObject(dataList);
接收到的代码是:
List dataList = (List) input_stream.readObject();
有人可以帮助我对这个数组进行搜索。我在论坛中找到的只是简单的数组(EG.int [])。
我尝试将serializable添加到类和UID号但是收到java.lang.ClassNotFoundException: socketserver.ProteinData
错误消息。现在有人为什么?
感谢您的帮助。
答案 0 :(得分:6)
基本上,您需要要序列化的类正在实现Serializable
。如果你想避免与序列相关的警告,你应该每个都有一个long serialVersionUID
,这是一个代码,用于区分你的特定版本的类。阅读像this one这样的教程来获取更多信息,序列化并不是很难处理..
但请记住,在两个不同版本的JVM之间使用时序列化是错误的(并且它通常有一些缺陷)。
只是旁注:接口Serializable
实际上并没有为类本身提供任何必需的功能(它不是典型的接口),它仅用于区分应该发送的类流和其他所有。当然,如果一个类是Serializable
,它所使用的所有组件(实例变量)也必须是可序列化的,以便能够发送整个对象。
答案 1 :(得分:4)
将您的班级声明更改为:
class ProteinData 实现Serializable { ... }
答案 2 :(得分:1)
我认为至少你需要
class ProteinData 实现Serializable 和
private static final long serialVersionUID = 1234556L; (Eclipse将为您生成幻数)。 在课堂上。