序列化框架(没有no-arg构造函数)

时间:2011-01-07 16:14:27

标签: java serialization deserialization

我正在寻找有关基于以下(Java)序列化对象图的最佳方法的一些信息:

  • 同一类的两个对象必须是二进制相等(逐位),如果它们的状态相等则为真。 (不得依赖于JVM字段排序)。
  • 集合仅使用数组建模(无任何集合)。
  • 所有实例都是不可变的
  • 序列化格式应为byte []格式,而不是基于文本。
  • 我控制图中的所有类。

我不想在类中放置一个空构造函数来支持序列化。 我已经考虑过在Objenisis上实现一个基于我自己的遍历的解决方案,但我的问题似乎并不那么独特。首先要更好地检查任何现有/完整的解决方案。

更新了详细信息:

首先,谢谢你的帮助!

  • 对象必须根据对象状态序列化为完全相同的位顺序。这很重要,因为二进制内容将进行数字签名。序列化格式的重建将基于对象的状态而不是原始位的存储。
  • 不同技术之间的互操作性很重要。我确实看到在ex上运行的软件。 .Net在未来。序列化格式没有Java风格。

关于immutability注释的注意事项:数组的值从参数复制到构造函数中的内部字段。不太重要。

致以最诚挚的问候,

Niclas Lindberg

5 个答案:

答案 0 :(得分:2)

您可以使用反射或手动编码方法自行编写数据。我使用看起来像手工代码的方法,除了它们是生成的。 (手动编码的性能,以及在更改时不必重写代码的便利性)

开发人员经常谈论内置的java序列化,但你可以通过自定义序列化来做任何你想做的事情。

为了给你更详细的答案,这取决于你想要做什么。

顺便说一句:您可以将数据序列化为byte [],并使其在文本编辑器中仍然可读/文本/可编辑。您所要做的就是使用看起来像文本的二进制格式。 ;)

答案 1 :(得分:0)

了解序列化的重要一点是,不能保证在多个Java版本中保持一致。它并不意味着将数据存储在磁盘上或永久存储的任何地方。

它在内部用于在RMI或其他网络协议期间将类从一个JVM发送到另一个JVM。这些是您应该使用Serialization的应用程序类型。如果这描述了您的问题 - 两个不同JVM之间的短期通信 - 那么您应该尝试进行序列化。

如果您正在寻找一种更永久地存储数据的方法,或者您需要在Java的正向版本中存活数据,那么您应该找到自己的解决方案。根据您的要求,您应该创建某种方法,将每个对象自己转换为字节流并将其读回对象。然后,您将负责确保格式与未来的对象和功能向前兼容。

我强烈推荐Joshua Bloch的 Effective Java 第11章。

答案 2 :(得分:0)

Externalizable接口是您正在寻找的吗?您完全控制对象的持久化方式,并使用OO样式,使用继承的方法和所有方法(与Serializable一起使用的私有read- / write-Object方法)。但是,你仍然无法摆脱无法访问构造函数的要求。

答案 3 :(得分:0)

也许您想熟悉可用于Java的序列化框架。一个很好的起点是thift-protobuf-compare项目,其名称具有误导性:它比较了使用Java序列化数据的10种方法的性能。

似乎你最难的约束是Interoperability between different technologies。我知道Googles Protobuffers和Thrift在这里提供。 Avro也可能适合。

答案 4 :(得分:0)

你唯一能得到这个的方法是:    A / USE UTF8文本,I.E。 XML或JSON,二进制转为base64(http / xml安全种类)。    B /强制所有数据的UTF8二进制排序。    C /打包除了所有未转义的空格以外的内容。    D /哈希内容并在文件中的位置标准位置提供该哈希值。