0

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

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

前任。

enum Type 
{ 
 HELLO,
 BYE,
 LISTEN,
}

class Message
{
Type type;
Object data;
}

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

所以我的问题是我是否需要一个工具writeObjectreadObject在我的Message班级和/或data's班级类型内部?

--- 更新 1 ---

是的,Message类型和底层data类型都有implements Serializable,所有的 Eclipse 都是serialVersionUID为我生成的。这足够了吗?我仍然没有看到data消息的一部分。

4

3 回答 3

2

确保写入的所有对象ObjectOutputStream都是Serializable.

Javadoc明确指出:

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

确保class Message实现SerializableExternalizable接口。


根据您的更新,Object datais anObject并且默认情况下Objectis not Serializable。您可以将其声明为Serializable data. 如前所述,只有 Serializable 对象可以写入 OutputStream

于 2012-05-26T22:07:38.420 回答
1

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

于 2012-05-26T22:13:13.607 回答
0

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

于 2012-05-26T22:27:24.540 回答