我们大量使用序列化,并且必须在我们使用的每个对象上指定Serializable标记是一种负担.特别是当它是第三方课程时,我们无法真正改变.
问题是:由于Serializable是一个空接口,一旦你添加了Java就提供了强大的序列化 implements Serializable
- 为什么它们不能使所有序列化都可以进行,那就是它?
我错过了什么?
序列化充满了陷阱.这种形式的自动序列化支持使类内部成为公共API的一部分(这就是javadoc为您提供持久形式的类的原因).
对于长期持久性,类必须能够解码此表单,这限制了您可以对类设计进行的更改.这破坏了封装.
序列化也可能导致安全问题.通过能够序列化它有引用的任何对象,类可以访问通常无法访问的数据(通过解析结果字节数据).
还有其他问题,例如内部类的序列化形式没有很好地定义.
使所有类可序列化会加剧这些问题.查看Effective Java Second Edition,特别是Item 74:明智地实现Serializable.
我认为这次Java和.Net人都错了,最好是默认情况下将所有内容都序列化,只需要标记那些无法安全序列化的类.
例如,在Smalltalk(70年代创建的语言)中,默认情况下每个对象都是可序列化的.我不知道为什么在Java中不是这种情况,考虑到绝大多数对象可以安全地序列化,而其中只有少数不是.
将对象标记为可序列化(带有接口)并不能神奇地使该对象可序列化,它一直是可序列化的,只是现在你表达了系统可以自己找到的东西,所以我看不出真正的理由.序列化是现在的方式.
我认为设计师或序列化做出的糟糕决定是事后的想法,或者平台从未准备好在所有对象上默认安全地进行序列化.
并非所有东西都是真正可序列化的.例如,采用网络套接字连接.您可以序列化套接字对象的数据/状态,但活动连接的本质将丢失.
Serializable在Java中的主要作用是默认情况下实现所有其他非可序列化的对象.序列化是一种非常危险的机制,尤其是在其默认实现中.因此,就像在C++中的友谊一样,默认情况下它是关闭的,即使它花费一点可以使事物可序列化.
序列化增加了约束和潜在问题,因为结构兼容性没有保证.它默认是关闭的.
我必须承认,我已经看到很少的非平凡类,标准序列化可以实现我想要的.特别是在复杂数据结构的情况下.因此,您需要花费大量时间才能使类序列化,这使得添加接口的成本相形见绌.
对于某些类,特别是那些表示更像物理的类,如文件,套接字,线程或数据库连接,序列化实例绝对没有意义.对于许多其他人来说,序列化可能会有问题,因为它会破坏唯一性约束,或者只是强迫您处理类的不同版本的实例,这可能是您不想要的.
可以说,默认情况下使所有Serializable都可以更好,并通过关键字或标记接口使类不可序列化 - 但是那些应该使用该选项的人可能不会考虑它.它的方式,如果你需要实现Serializable,你会被一个例外告诉你.