我正在寻找有关基于以下(Java)序列化对象图的最佳方法的一些信息:
我不想在类中放置一个空构造函数来支持序列化。 我已经考虑过在Objenisis上实现一个基于我自己的遍历的解决方案,但我的问题似乎并不那么独特。首先要更好地检查任何现有/完整的解决方案。
更新了详细信息:
首先,谢谢你的帮助!
关于immutability注释的注意事项:数组的值从参数复制到构造函数中的内部字段。不太重要。
致以最诚挚的问候,
Niclas Lindberg
答案 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 /哈希内容并在文件中的位置标准位置提供该哈希值。