![](/img/trans.png)
[英]why we have Externalizable when we can override writeObject and readObject in java
[英]When to Override writeObject/readObject?
似乎是一个非常简单的问题,但我找不到Google的直接答案。
我在UDP的两个进程之间有一个简单的IPC通道。 每个消息都包装在标头类中(例如,数据驱动)。
例如
enum Type
{
HELLO,
BYE,
LISTEN,
}
class Message
{
Type type;
Object data;
}
该Message
是我要发送到ObjectOutputStream writeObject
。 对于没有data
有效负载的消息(例如HELLO
和BYE
),此方法很好用。 但是, LISTEN
消息将data
属性设置为自定义类(具有所有POD类型),并且似乎永远不会到达其他过程。 当我在另一侧readObject
时,我什么也没得到。
所以我的问题是我是否需要在Message
类和/或data's
类类型内实现writeObject
和readObject
实现?
-更新1-
是的, Message
类型和基础data
类型都implements Serializable
并且所有的Eclipse都为我生成了serialVersionUID
。 够了吗? 我仍然看不到消息的data
部分。
确保所有写入ObjectOutputStream
对象都可Serializable
。
Javadoc明确指出:
只有支持java.io.Serializable接口的对象才能写入流。
确保class Message
实现了Serializable
或Externalizable
接口。
根据您的更新, Object data
是Object
,默认情况下, Object
不是可Serializable
。 您可以将其声明为可Serializable data
。 如前所述, 只能将Serializable对象写入OutputStream 。
实现writeObject
和readObject
并不是对象可序列化的必要条件-它们仅用于自定义序列化,而不是启用序列化。
通过仅实现Serializable接口,就可以对对象进行序列化了。 但是,您可以覆盖这些方法以允许自定义序列化。 例如,您可能要序列化GregorianCalendar。 GregorianCalendar拥有大量数据(时区等),例如,您仅使用日,月和小时。 然后,可以通过使这些方法只编写这些部分来避免节省其他所有内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.