有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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错误消息。现在有人知道为什么了吗

谢谢你的帮助


共 (3) 个答案

  1. # 1 楼答案

    我想至少你需要

    类ProteinData实现可序列化 还有

    私有静态最终长serialVersionUID=1234556L; (Eclipse将为您生成神奇的数字)。 在课堂上

  2. # 2 楼答案

    基本上,需要序列化的类实现Serializable。如果你想避免与序列号相关的警告,你应该为每个序列号都设置一个long serialVersionUID,这是一个用于区分特定版本的类的代码。阅读像this one这样的教程来获取更多信息,序列化并不难处理

    但是,请记住,在两个不同版本的JVM之间使用序列化时是有缺陷的(通常它有一些缺陷)

    只是附带说明:接口Serializable实际上并没有给类本身提供任何必需的特性(它不是一个典型的接口),它只是用来区分应该通过流发送的类和所有其他类。当然,如果一个类是Serializable,那么它使用的所有组件(实例变量)也必须是可序列化的,才能发送整个对象

  3. # 3 楼答案

    将您的班级声明更改为:

    类ProteinData实现可序列化{ ... }