【问题标题】:Why can't I serialize an object without a no-arg constructor even though it implements Serializable?为什么我不能序列化没有无参数构造函数的对象,即使它实现了可序列化?
【发布时间】:2014-03-12 03:19:53
【问题描述】:

我正在尝试使用 Titan 图形数据库序列化 UUID,但我相信我不能,因为根据 Serializable 的定义,java.util.UUID 无法提供无参数构造函数。

(请参阅http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html 的顶部)

鉴于 java.util.UUID 声称要实现 Serializable,这是怎么回事?这仅仅是为了向后兼容而无法消除的历史错误,还是这种奇怪(对我来说,很烦人)的选择有特定的技术原因?

更新:根据答案,UUID 实际上是 可序列化的,我误读了无参数构造函数规则,该规则很微妙,实际上并不需要同一类中的无参数构造函数。我无法序列化我的原因是 Titan(或其依赖项)添加了更严格的无参数 declared 构造函数规则——而不是核心 Java。我不知道是谁在强加这条规则,Java 还是 Titan。

【问题讨论】:

  • 你有堆栈跟踪吗?可以加吗?
  • 看看这里,这可能会有所帮助:stackoverflow.com/questions/4124907/…
  • UUID 是可序列化的,并且您误读了文档:无参数构造函数规则仅适用于可序列化类扩展不可序列化类并管理该类字段的序列化时。与其做出假设,不如展示您的代码和堆栈跟踪。 -1,直到你这样做。
  • 为我工作:ideone.com/oVWNFI
  • @kdgregory 这也不正确。最近的不可序列化基类必须提供无参数构造函数;它与“并管理该类的序列化”无关;并且所有可序列化的类最终都扩展了一个不可序列化的类,因为 java.lang.Object。

标签: java serialization uuid titan kryo


【解决方案1】:

Serializable 类不需要无参数构造函数。它最近的不可序列化基类确实如此。

您误读了规范。

【讨论】:

  • 所以,我尝试使用使用 Kryo 序列化程序的 Titan 图形数据库。我的一种类型是 UUID,由于没有无参数构造函数而无法序列化。但是,EJP,我重新阅读了规范,发现你是对的,这不是确切的要求。因此这实际上是 Titan/Kryo 中的一个错误,它在 KryoSerializer#isValidClass 中包含以下内容:“for (Constructor c : type.getDeclaredConstructors()) if (c.getParameterTypes().length==0) return true;”
  • 但是它在哪里说对象序列化的规则完全适用于 Kryo,并且没有其他规则?这是它成为 Kryo 错误的唯一方法。
  • 哪里说他们没有?当您使用像 Serializable 这样在上下文中具有公认定义的通用基本术语时,您有责任明确说明您以不同方式使用该术语。我相信 Kryo 可能会提到这一点,但这并不是重点,因为受影响的代码是 Titan 对 Kryo 的使用,而不是 Kryo。我正要为 Titan 提交一个错误,但注意到 Titan 实际上确实提到了这个问题,这使它不是错误,而是记录在案的差异。所以我想我不会在任何地方提交任何文件。我只是对 Titan 的文档感到困惑。感谢您的解释,我现在不是。
  • @DomingoIgnacio 如果您想要 Kryo 序列化的规则,您应该查看 Kryo 文档。如果您想要 Java 对象序列化的规则,您应该查看 Java 对象序列化规范。将规则从一个导入另一个是没有意义的。
猜你喜欢
  • 2015-09-13
  • 2015-12-23
  • 2013-05-26
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多