实现Serializable接口的类

3
当我们在Java中开发一个类时,判断是否应该使该类可序列化通常很简单。如果该类表示可以通过网络传输的模型对象,则应该将其设置为可序列化。
这种推理正确吗?
如果是这样,那么一些本地Java API类实现序列化而其他类不实现序列化的逻辑是什么?
从实现Serializable接口的本地类列表中可以看出,有多个原因实现序列化。
http://download.oracle.com/javase/6/docs/api/java/io/class-use/Serializable.html
欢迎任何澄清。
2个回答

0
如果该类表示可能在网络上传输的模型对象,则应该将其序列化。这种推理有一定道理吗?
这种推理有一定道理。如果您正在创建一个重要的公共API,兼容性很重要,您可能希望使类可序列化,因为它们可能需要被序列化。但是,如果您正在创建一个私有应用程序,则只有在需要时才应将类设置为可序列化。避免实现Serializable的原因之一(还有其他原因)是它引入了维护和保护可序列化类的新添加“接口”的需要:其字节码表示。
如果是这样,那么一些本地Java API类成为可序列化而其他类则不是的逻辑是什么?从实现Serilizable的本机类列表中可以看出,似乎有多个原因要实现可序列化。

Java API中许多类没有实现Serializable的主要原因之一是,由于接口和继承的性质,任何扩展实现了Serializable的类的类也必须实现Serializable。例如,如果{{link1:java.lang.Object实现了Serializable}},那么每个Java类都需要被设计为可以正确序列化。这将对任何类的设计产生巨大的负担:突然间,安全性、字节码有效性和兼容性都需要考虑。


迟到总比不来得好。 - Kevin

0

决定何时实现Serializable接口不应该简单。

实现这个接口会使你的类暴露给一种超语言机制来创建对象。在这里,超语言指的是Java语言中通常构造函数机制之外的机制。这实际上是一件坏事,意味着你可能需要重新验证反序列化对象上的所有类不变量,并强制执行实例控制(如果已经建立了这样的系统)。

它可以使你的类容易受到破坏和安全攻击的威胁。它还可能损害封装/信息隐藏(因此,如果没有经过深思熟虑地完成,就会永远将你与特定实现绑定在一起)。

实现Serializable应该是一个有意识的、慎重的选择...然后,只有在这种情况下,你应该仅序列化对象的逻辑状态。所有其他字段都应标记为transient。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接