当我们在java中开发一个类时,决定是否应该使类可序列化通常很简单。如果类表示可以跨越n / w传输的模型对象,则它应该是可序列化的
这种推理是否正确?
如果是这样,一些本机Java API类可以序列化的逻辑是什么,而其他Java API类不是?
从实现Serilizable的本机类列表中可以看出,实现可序列化的原因不止一个
http://download.oracle.com/javase/6/docs/api/java/io/class-use/Serializable.html
任何澄清都将不胜感激。
答案 0 :(得分:0)
如果类表示可以跨越的模型对象 不,它应该是可序列化的。 这种推理是否正确?
这种推理有点正确。如果要创建兼容性很重要的公共API,您可能希望将可序列化的类设置为可能有一天需要序列化。但是,如果要创建私有应用程序,则应仅在需要时使类可序列化。尝试避免实现Serializable
的一个原因(少数)是它引入了维护和保护新添加的“接口”到可序列化类的需要:它的字节码表示。
如果是这样,一些原生Java API类背后的逻辑是什么 可序列化而其他人不是?从此本机类列表中 实现Serilizable,似乎不止一个 实现序列化的原因。
Java API中许多类未实现Serializable
的主要原因之一是,由于接口和继承的性质,任何扩展实现Serializable
的类的类也必须实施Serializable
。例如,如果java.lang.Object
implemented Serializable
,则需要将每个java类设计为可正确序列化。这会给任何类的设计带来很大的负担:突然之间,需要考虑安全性和字节码的有效性和兼容性。
答案 1 :(得分:0)
何时实施Serializable的决定应该不简单。
实现此接口会将您的类暴露给用于创建对象的extralinguistic机制。为此,Extralinguistic意味着Java语言中通常的构造函数机制之外。这实际上是一件坏事,这意味着您可能需要重新验证反序列化对象上的所有类不变量并强制实例控制(如果这样的系统已经到位)。
它可以使您的课程容易腐败,并且易受安全攻击。它还可以破坏封装/信息隐藏(因此如果没有仔细考虑,将永远将您与特定实现联系起来)。
实现Serialzable应该是一个刻意的,有意识的选择......然后,只有这样,你应该只序列化对象的逻辑状态。所有其他字段应标记为瞬态。