序列化对象数组以通过套接字发送

时间:2010-11-23 13:47:37

标签: java arrays sockets serialization object

我有一个从数据库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错误消息。现在有人为什么?

感谢您的帮助。

3 个答案:

答案 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将为您生成幻数)。 在课堂上。