java序列化通过socket发送的对象数组
我有一个从数据库结果集创建的数组。我正在尝试序列化它,以便通过socket流发送它。目前,我收到一个错误,告诉我数组不可序列化。下面是我的代码,第一部分是为数组创建对象的类:
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();
有人能帮我把这个数组序列化吗。我在论坛上只能找到简单的数组(例如int[])
我试图将serializable添加到类和UID编号中,但收到了java.lang.ClassNotFoundException: socketserver.ProteinData
错误消息。现在有人知道为什么了吗
谢谢你的帮助
# 1 楼答案
我想至少你需要
类ProteinData实现可序列化 还有
私有静态最终长serialVersionUID=1234556L; (Eclipse将为您生成神奇的数字)。 在课堂上
# 2 楼答案
基本上,需要序列化的类实现
Serializable
。如果你想避免与序列号相关的警告,你应该为每个序列号都设置一个long serialVersionUID
,这是一个用于区分特定版本的类的代码。阅读像this one这样的教程来获取更多信息,序列化并不难处理但是,请记住,在两个不同版本的JVM之间使用序列化时是有缺陷的(通常它有一些缺陷)
只是附带说明:接口
Serializable
实际上并没有给类本身提供任何必需的特性(它不是一个典型的接口),它只是用来区分应该通过流发送的类和所有其他类。当然,如果一个类是Serializable
,那么它使用的所有组件(实例变量)也必须是可序列化的,才能发送整个对象# 3 楼答案
将您的班级声明更改为:
类ProteinData实现可序列化{ ... }