如何在Java中实现更灵活的序列化和反序列化?

如何在Java中实现更灵活的序列化和反序列化?,java,serialization,Java,Serialization,如果我在Java中序列化一个对象,然后在Java类中添加一个额外的字段,我就无法将该对象反序列化到修改过的类中 是否有一个序列化库或某种方式可以让反序列化不那么严格,比如如果有一个额外的字段添加到类中,那么在反序列化旧版本的类时,它只是用null填充该字段 实施,你可以做任何你想做的事。将串行/反序列化的责任完全放在被序列化的类上。您有很多潜在的选择 您可以使用图形序列化库来定义和管理您的格式,例如Google的或。我相信这两个版本都内置了对版本控制的支持 您可以编写自己的自定义序列化代码并显式

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


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

实施,你可以做任何你想做的事。将串行/反序列化的责任完全放在被序列化的类上。

您有很多潜在的选择

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

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


或者,您可以以“灵活”的方式设计类,例如,将所有字段存储在HashMap中,并通过字符串进行索引。根据您尝试执行的操作,这可能是一个方便的选项。

您需要在类中保留一个
serialVersionUID
。查看中的“版本控制”部分。

是否添加了serialVersionUID?如果要序列化/反序列化类的不同版本,则必须存在(且保持不变)

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

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

ObjectInputStream的Javadoc提供了有关其用法的更多详细信息。

有很多序列化库,请看一下简单的:

或者如上所述的谷歌协议缓冲区

如果我用Java序列化一个对象 然后,稍后将一个额外字段添加到 java类,我无法反序列化 对象导入修改过的类


从一开始就不是这样。在继续之前,您需要仔细查看对象序列化规范的版本控制部分。

您不需要java的序列化。查看一些简单的xml/json序列化库。序列化的Java对象有一个巨大的缺点,即除非再次反序列化它们,否则不可读。使用基于文本的格式,如xml或json,不仅可以使内容可读,还可以使序列化方式更具可定制性(即您的版本问题)。我认为json是一种比xml更好的序列化格式,但代价是需要一个json库。@W.Craig-是的,我同意,JSON也是一个很好的选择。@W.Craig——你也会为xml库付出同样的代价——我不会建议任何人自己解析xml。If-Xml:使用JAXB。更少的开销:JSON。@f1sh,使用Java,您已经将XML库作为运行时的一部分;您需要添加JSON库(承认它比XML库小得多/快得多)