繁体   English   中英

什么时候覆盖writeObject / readObject?

[英]When to Override writeObject/readObject?

似乎是一个非常简单的问题,但我找不到Google的直接答案。

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

例如

enum Type 
{ 
 HELLO,
 BYE,
 LISTEN,
}

class Message
{
Type type;
Object data;
}

Message是我要发送到ObjectOutputStream writeObject 对于没有data有效负载的消息(例如HELLOBYE ),此方法很好用。 但是, LISTEN消息将data属性设置为自定义类(具有所有POD类型),并且似乎永远不会到达其他过程。 当我在另一侧readObject时,我什么也没得到。

所以我的问题是我是否需要在Message类和/或data's类类型内实现writeObjectreadObject实现?

-更新1-

是的, Message类型和基础data类型都implements Serializable并且所有的Eclipse都为我生成了serialVersionUID 够了吗? 我仍然看不到消息的data部分。

确保所有写入ObjectOutputStream对象都可Serializable

Javadoc明确指出:

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

确保class Message实现了SerializableExternalizable接口。


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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM