【问题标题】:Serialization framework (no no-arg constructor)序列化框架(无参数构造函数)
【发布时间】:2011-01-07 16:14:26
【问题描述】:

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

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

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

更新详情:

首先,感谢您的帮助!

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

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

最好的问候,

尼古拉斯·林德伯格

【问题讨论】:

  • 数组不是不可变的,因此您的要求在那里似乎存在冲突(除非您的意思是所有对象除了数组都应该是不可变的)。
  • @ColinD,我认为他的意思是按照惯例,数组一旦设置就不会更改。 Java 中没有任何东西可以强制执行此行为。
  • @Peter:没有什么 Java 可以强制数组的不变性,但是对象数组在 Java 中真的没有太多位置了,除了在集合的实现中。并且集合可以是不可变的。
  • @ColinD,我经常使用数组可能不会让你感到惊讶。虽然不如收藏。 ;)
  • @Peter:对象数组(显然,基元是一个不同的故事)在几乎所有方面都不如集合。在我看来,实际上很少需要使用它们。

标签: java serialization deserialization


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2015-12-15
            • 1970-01-01
            • 2017-07-02
            • 1970-01-01
            • 1970-01-01
            • 2015-12-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多