我正在根据以下(Java)序列化对象图的最佳方法的一些信息:

  • 如果同一类是相等的,则同一类的两个对象必须是二进制相等的(刻度)。 (不得取决于JVM字段排序)。
  • 收集仅以数组(没有收藏)为模型。
  • 所有实例都是不变的
  • 序列化格式应采用字节[]格式而不是基于文本的格式。
  • 我可以控制图中的所有类。

我不想在课堂中放一个空的构造函数,只是为了支持序列化。我研究了基于我自己的遍历的解决方案,但我的问题似乎并不独特。最好先检查任何现有/完整的解决方案。

更新的详细信息:

首先,感谢您的帮助!

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

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

最好的祝福,

尼克·林德伯格

有帮助吗?

解决方案

也许您想熟悉Java可用的序列化框架。一个很好的起点是 Tift-Protobuf-Compare 该项目的名称具有误导性:它比较了使用Java序列化数据的10种以上方式的性能。

看来您拥有的最难约束是 Interoperability between different technologies. 。我知道Google可以在这里谷歌搜索和节俭。 Avro也可能合适。

其他提示

您可以使用反射或手动编码方法自己编写数据。我使用外观手动代码的方法,但它们是生成的。 (手工编码的性能以及不必在更改代码时重写的精神)

通常,开发人员谈论内置的Java序列化,但是您可以进行自定义序列化,以执行您想要的任何您想要的任何方式。

为了给您更详细的答案,这将取决于您要准确地做什么。

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

关于序列化的重要了解是,在多个版本的Java中不能保证它是一致的。这并不是将数据存储在磁盘上或永久性的任何地方的一种方式。

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

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

我强烈推荐第11章 有效的Java 约书亚·布洛克(Joshua Bloch)。

外部化界面是您想要的吗?您可以完全控制对象的持续方式,并使用继承和所有方法(与可序列化使用的私有读取 - /写入对象不同)。但是,您仍然无法摆脱无算式构造函数的要求。

您获得的唯一方法是:A/使用UTF8文本,即XML或JSON,二进制转到base64(HTTP/ XML安全品种)。 B/强制执行所有数据的UTF8二进制顺序。 C/包装内容物,除了所有未消除的白色空间。 d/哈希内容并在文件中的位置标准位置中提供哈希。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top