我如何序列化一个没有实现Serializable的对象?我无法将它标记为Serializable,因为这个类来自第三方库。如何序列化Java中的不可序列化?
回答
你不能序列化一个没有实现Serializable
的类,但是你可以把它包装在一个类中。为此,您应该在包装类上实现readObject
和writeObject
,以便您可以以自定义的方式对其对象进行序列化。
- 首先,使您的不可序列化字段
transient
。 - 在
writeObject
中,首先调用defaultWriteObject
来存储所有非瞬态字段,然后调用其他方法来序列化不可序列化对象的各个属性。 - 在
readObject
中,首先在流上调用defaultReadObject
来回读所有非瞬态字段,然后调用其他方法(对应于您添加到writeObject
的那些方法)来对您的不可序列化对象进行反序列化。
我希望这是有道理的。 :-)
这不是假定需要在非序列化对象中获取(de)序列化的所有内容对包装它的类都是可见的吗? – whaley 2011-05-28 19:55:57
@whaley:是的。通常情况下,需要保存的是外部可见状态,所以这应该不成问题。 (这与你的XML/JSON/YAML解决方案的限制没有什么不同::-P) – 2011-05-28 20:21:05
不确定你的第2点和第3点意味着什么可以请给出一个示例代码(在java编程中的新手) – 2015-03-03 12:10:26
如果这个类不是最终的,你可以让你自己的类扩展它并实现Serializable。不过,除了Java的内置机制外,还有很多其他的序列化方法。
将不可序列化的类包装在您自己的实现Serializable
的类中。在你的类的writeObject
方法中,做任何必要的操作来序列化不可序列化对象上足够的信息,以便你的类的readObject
方法可以重建它。
或者,联系不可序列化的类的开发人员,并告诉他修复它。 :-)
如果你的类已经实现Serializable接口(序列化所需的),你必须做的就是声明你不想短暂序列化领域:
public transient String description;
这个问题特别是关于类不* *实现Serializable。 – 2016-09-14 11:26:30
您可以使用KRYO。它适用于非序列化的类,但类需要预先注册。
- 1. setAttribute:不可序列化的属性(Java对象序列化)
- 2. Java-使用Xstream序列化不可序列化的对象
- 3. 如何序列化/反序列化Java中的引用?
- 4. Java可序列化 - 序列化/反序列化是否具有安全性?
- 5. Java序列化
- 6. Java序列化
- 7. Java序列化
- 8. 序列化 - 如何保护序列化的JAVA对象?
- 9. 不序列化的Java
- 10. 使用C#序列化Java可反序列化的对象
- 11. 为什么可序列化的内部类不可序列化?
- 12. 可能序列化一个不可序列化的对象?
- 13. 的Java序列化
- 14. 的Java序列化
- 15. 如何序列化Java中的AttributedString?
- 16. org.apache.spark.SparkException:任务不可序列化java
- 17. IllegalAccessException - 继承不可序列化的对象的序列化
- 18. 火腿不序列化+反序列化
- 19. 带有不可序列化部分的PHP序列化
- 20. Spring:序列化引用了不可序列化bean的对象
- 21. C#:在序列化时绕过不可序列化的属性
- 22. Java中的版本化序列化
- 23. 序列化HashTable,Java
- 24. 在Java序列化
- 25. Java Nio.FloatBuffer序列化
- 26. Java BufferedImage序列化
- 27. 在Java中反序列化一个序列化的php对象
- 28. 序列化和反序列化Java中的android.graphics.Bitmap
- 29. Java:序列化/反序列化到XML /而不是二进制
- 30. JSON不可序列化
'class SFoo extends com.library.Foo implements Serializable {}'? – wchargin 2013-11-09 02:47:23