何时覆盖writeObject / readObject?

时间:2012-05-26 22:01:15

标签: java serialization

似乎是一个非常直截了当的问题,但我找不到谷歌的直接答案。

我在UDP上的两个进程之间有一个简单的IPC通道。每条消息都包含在一个标题类中(例如数据驱动)。

实施例

enum Type 
{ 
 HELLO,
 BYE,
 LISTEN,
}

class Message
{
Type type;
Object data;
}

Message是我发送给ObjectOutputStream writeObject的内容。这适用于没有data有效负载的邮件(例如HELLOBYE)。但是,LISTEN消息将data属性设置为自定义类(包含所有POD类型),并且它似乎永远不会到达其他进程。当我在另一边readObject时,我什么都没得到。

所以我的问题是我在writeObject类和/或readObject类类型中需要一个工具Messagedata's吗?

---更新1 ---

Message类型和基础data类型都有implements Serializable,所有eclipse都为我生成serialVersionUID。那够了吗?我还没有看到消息的data部分。

3 个答案:

答案 0 :(得分:2)

确保写入ObjectOutputStream的所有对象均为Serializable

Javadoc明确指出:

  

只有支持java.io.Serializable接口的对象才可以   写入溪流。

确保class Message实施SerializableExternalizable界面。


根据您的更新,Object dataObject,默认情况下,Object不是Serializable。您可以将其声明为Serializable data。如前所述,只能将Serializable对象写入OutputStream

答案 1 :(得分:1)

实现writeObjectreadObject不是对象可序列化的必要条件 - 它们仅用于自定义序列化,而不是启用它。

答案 2 :(得分:0)

通过实现Serializable接口,一个对象就可以进行序列化了。但是,您可以覆盖这些方法以允许自定义序列化。例如,您可能想要序列化GregorianCalendar。 GregorianCalendar有大量的数据(时区等),你知道,例如,你只使用日,月和小时。然后,您可以通过使这些方法只编写那些部分来避免保存其他东西。