似乎是一个非常直截了当的问题,但我找不到谷歌的直接答案。
我在UDP上的两个进程之间有一个简单的IPC通道。每条消息都包含在一个标题类中(例如数据驱动)。
实施例
enum Type
{
HELLO,
BYE,
LISTEN,
}
class Message
{
Type type;
Object data;
}
Message
是我发送给ObjectOutputStream writeObject
的内容。这适用于没有data
有效负载的邮件(例如HELLO
和BYE
)。但是,LISTEN
消息将data
属性设置为自定义类(包含所有POD类型),并且它似乎永远不会到达其他进程。当我在另一边readObject
时,我什么都没得到。
所以我的问题是我在writeObject
类和/或readObject
类类型中需要一个工具Message
和data's
吗?
---更新1 ---
是Message
类型和基础data
类型都有implements Serializable
,所有eclipse都为我生成serialVersionUID
。那够了吗?我还没有看到消息的data
部分。
答案 0 :(得分:2)
确保写入ObjectOutputStream
的所有对象均为Serializable
。
Javadoc明确指出:
只有支持java.io.Serializable接口的对象才可以 写入溪流。
确保class Message
实施Serializable
或Externalizable
界面。
根据您的更新,Object data
为Object
,默认情况下,Object
不是Serializable
。您可以将其声明为Serializable data
。如前所述,只能将Serializable对象写入OutputStream 。
答案 1 :(得分:1)
实现writeObject
和readObject
不是对象可序列化的必要条件 - 它们仅用于自定义序列化,而不是启用它。
答案 2 :(得分:0)
通过实现Serializable接口,一个对象就可以进行序列化了。但是,您可以覆盖这些方法以允许自定义序列化。例如,您可能想要序列化GregorianCalendar。 GregorianCalendar有大量的数据(时区等),你知道,例如,你只使用日,月和小时。然后,您可以通过使这些方法只编写那些部分来避免保存其他东西。