Java Serializable(所有变量都受到影响吗?)

时间:2011-09-13 11:56:15

标签: java parsing serialization object

我想知道属性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

6 个答案:

答案 0 :(得分:4)

如果Foo不是Serializable,则尝试使用非null foo序列化Example实例将导致NotSerializableException,除非声明foo { {1}}。

你可以通过简单的尝试轻松找到自己的自我。

<强>更新 为了能够在您无法更改transient但需要保留其内容时序列化Example的实例,您可以实施FooreadObject()方法,如API doc of Serializable

答案 1 :(得分:2)

如果foo实例不是SerializableExample的序列化将在运行时失败 - 请尝试一下!

您可以通过提供ExamplereadObject方法提供writeObject的自定义序列化形式。

答案 2 :(得分:2)

如果Foo不可序列化,则尝试序列化Example实例将引发运行时异常。您需要使其可序列化,或将foo字段标记为transient。但在后一种情况下,在反序列化示例时,foo将为null。

答案 3 :(得分:1)

请参阅NotSerializableException

序列化期间不会省略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”一书中读到这一点 - 他对这个主题有很好的报道。 此外,互联网上有很多例子

例如Serialization Example

希望这有帮助

标记