如何编写自己的序列化器/解串器?

时间:2010-03-15 12:08:29

标签: java serialization

我需要在我的应用中保存对象 - 类的实例 - 就像某些文件类型一样。我怎么能为它编写自己的序列化/解串器?

或者存在一些更简单的方法如何将对象保存到某种文件类型?

使用io.serialization被评为“真正的”应用程序的不太好的解决方案。为什么呢?

5 个答案:

答案 0 :(得分:4)

当对象更改时(例如添加新字段时),序列化很困难。对象可能未按预期初始化或可能缺少某些数据。虽然有一些方法可以解决这个问题,但是可以通过创建用于反序列化和序列化的readObject和writeObject方法来实现自定义序列化。 XStream http://x-stream.github.io/等工具也可用于序列化为XML。根据您需要保留的实际数据,您可能需要考虑只编写所需的数据并重新读取,然后加载对象,而不是通过序列化写出整个对象图。

答案 1 :(得分:2)

您是否阅读过Discover the secrets of the Java Serialization API 它比较旧,但涵盖了大部分基本内容。

答案 2 :(得分:2)

首先尝试Java序列化机制。它们并不漂亮,但在大多数情况下,它们都可以完成这项工作。如果使用内置机制遇到特定问题,可能值得研究另一个选项。 与Java的序列化机制有关的特定问题,但它们对大多数情况无关紧要......

答案 3 :(得分:1)

java.io.Serializable是一种相对简单的序列化。它仅针对serialVersionUID进行验证,并且不允许您加载对象的旧版本/新版本。这意味着您保存的数据无效,并且对对象进行了重大更改。

另一种方法是以XML格式保存对象。但是这样的实现可能会变得棘手,因为您需要处理循环引用。您可以为要保存的所有类实现类似以下内容:

public Element asXmlElement(Document doc) {
    Element element = doc.createElement(this.getClass().getSimpleName());
    element.setAttribute("class", this.getClass().getName());
    element.setAttribute("id", this.getId().toString());
    elements.put(this.getId(), element);
    // add more properties here... either as child nodes or attributes!
    // i.e. element.appendChild(referencedObj.asXmlElement(doc));
    return element;
}

在对象图上递归调用此方法可能会以无限循环结束。您需要处理(即通过管理已处理对象的引用列表并在XML结构中嵌入refID元素)。

通过向XML节点添加版本属性,您可以管理加载对象数据的不同版本。您需要实现某种能够使用这些方法的Exporter / Importer类。当然,您需要与asXmlElement相反的方法...类似于fromXmlNode(节点节点),将数据解码为对象。

这只是一种可行的方法。

答案 4 :(得分:0)

我建议你阅读this literature。它描述了使用实际示例序列化对象的各种选项。

«默认机制虽然简单易用,但表现并不是最好的。»