如何在Java中进行更灵活的序列化和反序列化?

时间:2010-07-19 20:28:56

标签: java serialization

如果我在Java中序列化一个对象,然后在java类中添加一个额外的字段,我就无法将该对象反序列化为修改后的类。

是否有一个序列化库或某些方法可以让反序列化不那么严格,比如如果有一个额外的字段添加到类中那么它只是在反序列化旧版本的类时填充null?

6 个答案:

答案 0 :(得分:7)

您需要在课堂上保留serialVersionUID。查看this article by Sun中的“版本控制”部分。

答案 1 :(得分:5)

你有很多潜在的选择。

您可以使用图表序列化库来定义和管理您的格式,例如Google的protocol buffersKryo。我相信这两个都内置了对版本控制的支持。

您可以编写自己的自定义序列化代码并明确处理这些版本 - 例如序列化为灵活的格式,如XML。读取XML时,如果未指定特定字段,则可以将其配置为使用默认值。

或者您可以以“灵活”的方式设计课程,例如:将所有字段存储在HashMap中并由字符串索引。根据您的尝试,这可能是一个方便的选择。

答案 2 :(得分:1)

有一些公平的序列化库,看看Simple:

http://simple.sourceforge.net/

或如上所述Google Protocol Buffers。

http://code.google.com/apis/protocolbuffers/

答案 3 :(得分:0)

实施Externalizable,您可以随心所欲。将串行/反序列化的责任完全放在序列化的类上。

答案 4 :(得分:0)

您是否添加了serialVersionUID?如果要序列化/反序列化类的不同版本,则必须存在(并且不更改)。

此外,您可以在类中添加以下两个方法来准确定义序列化过程:

private void writeObject(java.io.ObjectOutputStream stream)
 throws IOException;
private void readObject(java.io.ObjectInputStream stream)
 throws IOException, ClassNotFoundException; 

ObjectInputStream的Javadoc提供了有关其用法的更多细节。

答案 5 :(得分:0)

  

如果我用Java序列化一个对象,和   然后再添加一个额外的字段   java类,我无法反序列化   对象进入修改后的类。

这一开始是不正确的。在进一步研究之前,您需要仔细查看对象序列化规范的版本控制部分。