繁体   English   中英

使用序列化是个好主意吗?

[英]Is using Serialization a good idea?

序列化存在一些风险,包括不兼容的更改。 如果要序列化的类中发生不兼容的更改,那么即使使用静态final final serialVersionUID字段,我们也无法对其进行反序列化。

那么,序列化的替代方案是什么? XML? 如果有任何替代方案,那么在现实世界项目中是否完全使用序列化?

当然还有Java序列化的替代品:XML(正如你所注意到的); JSON; protobuf的; 你想要使用的任何其他东西。

所有这些都会带来一些不兼容的变化风险。 我没有看到其他方法中有任何魔力。 如果向对象添加新属性,则必须处理“duck typing”。 如果删除所需的属性,则所有方法都会出现问题。

您似乎将序列化与数据格式混淆 - 最好将它们分开。

大致有三种序列化:

  1. 自动化,全面,低级 - 这很有用,因为它可以作为服务提供,并且只需要很少的工作量。 但是,就其性质而言,它与语言/程序中使用的内部格式密切相关 - 如果这种情况发生变化,那么反序列化将是“困难的”。 典型的例子是java和python提供的“本机”序列化; 它对程序状态的短期快照很有用。

  2. 自动,受限制,中等级 - 通常用于通信/互操作。 这不支持语言的所有功能,可能只允许保存简单的数据结构。 如果这是足够的,那么它是一个有用的中间立场,因为它可以自动化,但独立于语言的内部格式(但不一定是程序的细节)。 典型的例子包括协议缓冲区,thrift和json库( 不是 json本身,它是一种数据格式......); 显然,这对于通信和ad-hoc数据存储非常有用。

  3. “手工编码”,高级 - 这需要更多的工作,并且可能会节省更少的信息,但旨在以独立于程序(或语言)中使用的内部格式的方式提取“重要部分”。 例子包括docbook或open document(jaxb在默认情况下提供对close-to-(1)的支持相当不错,但是要小心接近(3)); 这对于长期数据存档很有用,并且通常与“官方”规范相关联。

与上面分开的是用于编码序列化数据的数据格式。 我相信你可以在xml中实现上述所有功能; json倾向于在(2)中使用。

无论如何,要回答这个问题 - (1)有你注意到的问题。 if(2)就足够了,那么这是一个简单的解决方案(但是如果程序中的数据结构发生变化,仍会遇到(1)的一些问题); 否则你需要做(3)所暗示的额外工作。

答案取决于你的目标。 如果您在Java进程之间发送数据,则默认的Java序列化机制可能正常工作。

但是,为了存储数据,特别是人们可能想要查看或编辑的数据,Java序列化机制非常不适合。

有许多优秀的基于XML的java序列化库,当我需要人类可读/可编辑的输出时,我更喜欢这些库。

两个很棒的是: XStreamJAXB

暂无
暂无

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

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