2

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

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

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

更新详情:

首先,感谢您的帮助!

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

关于不可变性的注释:数组的值从参数复制到构造函数的内部字段。不太重要。

最好的祝福,

尼古拉斯·林德伯格

4

5 回答 5

2

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

开发人员经常谈论内置的 java 序列化,但您可以使用自定义序列化来做任何您想做的事情,以任何您想要的方式。

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

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

于 2011-01-07T16:24:34.517 回答
0

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

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

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

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

于 2011-01-07T16:23:46.007 回答
0

Externalizable 接口是您正在寻找的吗?您可以完全控制对象的持久化方式,并且使用 OO 样式,使用继承的方法和所有方法(与 Serializable 使用的私有读/写对象方法不同)。但是,您仍然无法摆脱无参数可访问构造函数的要求。

于 2011-01-07T16:28:04.297 回答
0

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

似乎您遇到的最困难的约束是Interoperability between different technologies. 我知道 Google 的 Protobuffers 和 Thrift 在这里提供。Avro 也可能适合。

于 2011-01-08T22:44:11.873 回答
0

获得此信息的唯一方法是:A/ 使用 UTF8 文本、IE XML 或 JSON,二进制转换为 base64(http/xml 安全品种)。B/ 对所有数据强制执行 UTF8 二进制排序。C/ 打包除所有未转义的空白之外的内容。D/ 散列内容并在文件中的位置标准位置提供该散列。

于 2011-09-14T00:55:09.410 回答