2010-12-20 66 views
3

当我们在java中开发一个类时,是否应该使该类可序列化的决定通常很简单。如果类表示可以通过n/w传输的模型对象,则它应该是可序列化的。
这个推理是否正确?
如果是这样,那么一些原生Java API类的序列化后的逻辑是可序列化的,而另一些则不是?
从实现Serilizable的本地类的列表中,似乎有多个原因来实现可序列化。
http://download.oracle.com/javase/6/docs/api/java/io/class-use/Serializable.html实现可序列化的类

任何澄清,将不胜感激。

回答

0

如果这个类表示一个模型对象,它可以通过 n/w传输,它应该是可序列化的。 这个推理是否正确?

这个推理有点正确。如果你正在创建一个兼容性非常重要的公共API,你可能希望创建一个序列化的类,这些类可能需要序列化,这些类可能需要可能。但是,如果你正在创建一个私有应用程序,那么类只能在需要时才能被序列化。试图避免实现Serializable的一个原因是它引入了需要维护和保护新添加的“接口”到您的可序列化类:它的字节码表示。

如果是这样,什么是落后一些本地的Java API类是 序列化的,而有些则没有逻辑?从实现可串行化的本地类 的列表中,看起来存在多于一个的 原因来实现可序列化。

一个为什么许多类的Java API中没有实现Serializable的主要原因是,由于接口和传承的性质,从而延长它实现Serializable还必须实现Serializable类的任何类。例如,如果java.lang.Object implemented Serializable,每个java类都需要设计为可正确序列化。这会给任何类的设计带来很大的负担:突然间,需要考虑安全性和字节码的有效性和兼容性。

+0

比从未更好的迟到。 – Kevin 2013-11-21 11:05:40

0

什么时候执行Serializable的决定应该是而不是很简单。

实现此接口将您的类暴露给创建对象的extralinguistic机制。为了这个目的,异常语言意味着在Java语言中通常的构造机制之外。这实际上是一件坏事,这意味着您可能需要重新验证反序列化对象上的所有类不变量,并强制实例控制(如果放置了这样的系统)。

它可以使你的班级容易受到攻击并容易受到安全攻击。它也可能危及封装/信息隐藏(因此,如果不做深思熟虑的话,永远将你与特定的实现捆绑在一起)。

实现Serialzable应该是一个有意识的有意识的选择......然后,只有这样,才应该只序列化对象的逻辑状态。所有其他领域应该被标记为瞬态的。

相关问题