2011-05-28 86 views

回答

20

你不能序列化一个没有实现Serializable的类,但是你可以把它包装在一个类中。为此,您应该在包装类上实现readObjectwriteObject,以便您可以以自定义的方式对其对象进行序列化。

  • 首先,使您的不可序列化字段transient
  • writeObject中,首先调用defaultWriteObject来存储所有非瞬态字段,然后调用其他方法来序列化不可序列化对象的各个属性。
  • readObject中,首先在流上调用defaultReadObject来回读所有非瞬态字段,然后调用其他方法(对应于您添加到writeObject的那些方法)来对您的不可序列化对象进行反序列化。

我希望这是有道理的。 :-)

+0

这不是假定需要在非序列化对象中获取(de)序列化的所有内容对包装它的类都是可见的吗? – whaley 2011-05-28 19:55:57

+0

@whaley:是的。通常情况下,需要保存的是外部可见状态,所以这应该不成问题。 (这与你的XML/JSON/YAML解决方案的限制没有什么不同::-P) – 2011-05-28 20:21:05

+1

不确定你的第2点和第3点意味着什么可以请给出一个示例代码(在java编程中的新手) – 2015-03-03 12:10:26

0

如果这个类不是最终的,你可以让你自己的类扩展它并实现Serializable。不过,除了Java的内置机制外,还有很多其他的序列化方法。

+0

值得补充的是,这样做不会序列化私有或超级类的包私有字段。 – whaley 2011-05-28 19:24:02

+2

@whaley @Michael McGowan这不会序列化任何非序列化基类的字段。错误的答案,下来投票。 – EJP 2011-05-28 23:39:23

+0

@EJP也许我应该已经明确了'readObject'和'writeObject'的必要性,但是这些都是任何时候在父类不是Object的东西上实现Serializable的问题。答案真的只是不完整而非错误,不是吗? – 2011-05-29 08:07:17

5

将不可序列化的类包装在您自己的实现Serializable的类中。在你的类的writeObject方法中,做任何必要的操作来序列化不可序列化对象上足够的信息,以便你的类的readObject方法可以重建它。

或者,联系不可序列化的类的开发人员,并告诉他修复它。 :-)

2

如果你的类已经实现Serializable接口(序列化所需的),你必须做的就是声明你不想短暂序列化领域:

public transient String description; 
+1

这个问题特别是关于类不* *实现Serializable。 – 2016-09-14 11:26:30

0

您可以使用KRYO。它适用于非序列化的类,但类需要预先注册。