我想知道属性foo
是否也将在以下示例中序列化(写在我的脑海中):
public class Example implements Serializable {
private String a = "a";
private Foo foo = new Foo("a");
}
注意:Class Foo只包含一个属性a
,并且不实现Serializable
如果Foo
不是Serializable,我还有另一个问题,即Foo无法实现Serializable
,因为它是由来自外部.jar
文件的Api调用提供的。
同样在我的具体案例中,Foo还拥有一个Bar
类,它也不是Serializable
。
答案 0 :(得分:4)
如果Foo
不是Serializable,则尝试使用非null foo
序列化Example实例将导致NotSerializableException
,除非声明foo
{ {1}}。
你可以通过简单的尝试轻松找到自己的自我。
<强>更新强>
为了能够在您无法更改transient
但需要保留其内容时序列化Example
的实例,您可以实施Foo
和readObject()
方法,如API doc of Serializable
答案 1 :(得分:2)
如果foo
实例不是Serializable
,Example
的序列化将在运行时失败 - 请尝试一下!
您可以通过提供Example
和readObject
方法提供writeObject
的自定义序列化形式。
答案 2 :(得分:2)
如果Foo
不可序列化,则尝试序列化Example
实例将引发运行时异常。您需要使其可序列化,或将foo字段标记为transient
。但在后一种情况下,在反序列化示例时,foo将为null。
答案 3 :(得分:1)
序列化期间不会省略transient
个字段。
答案 4 :(得分:1)
然后否。
你会得到这个:
java.io.NotSerializableException: Foo
答案 5 :(得分:0)
如果您希望将Example对象序列化,我认为您需要处理自定义序列化。干得好: 1.鉴于Foo来自jar,你无法改变,使其成为瞬态(否则你将在运行时获得异常,如前所述)。 2.定义“readObject”/“writeObject”,然后管理您的序列化过程。 - 调用defaultWriteObject使Java序列化它可以序列化的内容。 提取foo类的状态(在你的例子中,Foo的内部状态是“a”) - 明确序列化“a” 在反序列化期间应该这样做: - 调用默认的反序列化机制 - 反序列化“a”(你知道在默认数据之后,流中有自定义字符串) - 从readObject中创建A的Foo实例。
总的来说,我建议在Joshua Bloch的“Effective Java”一书中读到这一点 - 他对这个主题有很好的报道。 此外,互联网上有很多例子
希望这有帮助
标记