Java中的序列化

5

当我定义一个实现Serializable接口的Java对象时,该对象的成员也变成可序列化吗?还是我必须沿着嵌套深度走得更远,在路径上重新定义每个对象为可序列化?


请查看此答案:https://dev59.com/TEvSa4cB1Zd3GeqPcCQB#2007214 或许可以帮助您了解有关序列化过程的一些细节。 - JuanZe
4个回答

6

在Java中,您经常使用的大多数类都是可序列化的(如Collections、String、Number的后代等),但是您引用的任何类都必须是可序列化的或声明为瞬态。当然,如果它们是瞬态的,在类反序列化时就不会被引用。


本质上,这是相同的论点 - 标准JDK实现(如ArrayList)本身是可序列化的,但如果您尝试序列化包含非可序列化对象的对象,则会失败。 - Neil Coffey
从API中:List超级接口不扩展Serializable,但常用的ArrayList、Stack、LinkedList和Vector都实现了Serializable。 - Pops
非常感谢,找不到任何文件或规范说明这一点。 - The Machine
http://java.sun.com/javase/6/docs/api/java/util/List.html非常有用,其中包含指向ArrayList、LinkedList等页面的链接。 - Pops

3
实现Serializable接口只会给你提供序列化支持,前提是所有的非transient成员(感谢danben)都是原生类型或可序列化类。
所以,如果你的许多成员是不可序列化的不同对象,那么你也必须使它们可序列化。
除非它们对于表示对象状态并不重要。如果你可以在没有它们的情况下重新创建对象,那么你可以将这些成员声明为transient以便从序列化中省略它们。

2
所有非瞬态成员,我相信。 - danben
编译器不幸没有检查这个! - Neil Coffey
嗯,那么它就是一个运行时异常或者类似的东西。 - Joey
很遗憾,在运行时抛出了NotSerializableException异常。 - stacker
尽管编译器不会检查它,但是IDE(确切地说是IDEA,可能还包括Eclipse和其他一些IDE)可以配置为警告你。 - Yishai

0

成员不会自动变为可序列化。

如果您在类中编写了自己的成员,则必须转到每个成员并使它们可序列化(通过实现接口)。

JAVA库提供的大多数类型已经是可序列化的,因此这不应该困扰您。

当然,这适用于所有成员的递归。

换句话说 - 如果需要传输或保存对象内任何深度的数据或值,则必须将其序列化。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接