2012-02-28 43 views
0

.class文件为每种类型的对象提供蓝色打印,Java具有丰富的功能来提取对象的属性,包括其所有状态。 那么为什么我们仍然需要实现可序列化,我们是否可以在给定.class文件的情况下自动序列化?是否可以自动序列化知道.class文件的对象

+1

允许一个类被序列化并不总是可取的。一个例子是安全性。如果对象的实例包含密码,我们可能不希望将其写入磁盘。 – Asaph 2012-02-28 17:52:28

回答

3

Serializable接口是一个标记接口,它在它没有方法或字段。它只是由我们可能想要序列化的对象实现。

而且序列化是一个昂贵的事,因为(从有效的Java第二版两者):

  1. 实现Serializable接口的主要成本是它降低了灵活性 改变类的实现,一旦它已经释放。当 类实现Serializable时,其字节流编码(或序列化形式) 成为其导出的API的一部分。一旦广泛分发课程,您通常需要 才能永久支持序列化表单,就像您要求 支持导出的API的所有其他部分一样。

  2. 实施Serializable的第二个成本是它增加了错误和安全漏洞的可能性 。

  3. 实现Serializable接口的第三个代价是增加了与释放类的新版本相关的测试 负担。当修改可序列化的 类时,检查是否可以序列化新版本的 中的实例并将其反序列化为旧版本,反之亦然。

+0

正如您所提到的,“当类实现Serializable时,其字节流编码(或序列化形式)成为其导出的API的一部分”,为什么java不能通过查看.class文件生成唯一的字节顺序?我问这个问题的原因是,如果java可以,他们会附加一个.class文件并自动序列化(我知道给一个.class文件不会很好,但至少它是一个选择)。在我看来,它仍然存在一些微妙的问题。 – 2012-02-28 18:40:16

+0

@Helin Wang:默认情况下,它可以并且自动序列化一个类实例,但是如果你改变这个类,那么新版本就无法读取旧的那个。如果你自己处理这个问题,你可以输入版本号,或者以其他方式解码旧版本的数据。 – RalphChapin 2012-02-28 20:09:55

0

可序列化只是一个标记接口;你不需要提供任何实现。 Java将提供一个适用于大多数情况的合理的默认实现。在Java

0

鉴于一个对象可以引用一堆其他对象,序列化该类会变得非常有趣。序列化一个对象可能导致成千上万的对象被序列化。结果可以毫不费力和出色,但99.9%的时间您需要控制和限制至少一部分操作。当您将类实例移到长期打开的套接字上时,尤其如此。

因此,标记一个类“可序列化”是指出你已经想通了所有的分支。这些可能是微不足道的,也可能是巨大而复杂的。但要小心:向流中写入一个类实例可以将导致序列化已知Universe的一半。