当前位置:  开发笔记 > 编程语言 > 正文

为什么Java需要Serializable接口?

如何解决《为什么Java需要Serializable接口?》经验,为你挑选了5个好方法。

我们大量使用序列化,并且必须在我们使用的每个对象上指定Serializable标记是一种负担.特别是当它是第三方课程时,我们无法真正改变.

问题是:由于Serializable是一个空接口,一旦你添加了Java就提供了强大的序列化 implements Serializable- 为什么它们不能使所有序列化都可以进行,那就是它?

我错过了什么?



1> McDowell..:

序列化充满了陷阱.这种形式的自动序列化支持使类内部成为公共API的一部分(这就是javadoc为您提供持久形式的类的原因).

对于长期持久性,类必须能够解码此表单,这限制了您可以对类设计进行的更改.这破坏了封装.

序列化也可能导致安全问题.通过能够序列化它有引用的任何对象,类可以访问通常无法访问的数据(通过解析结果字节数据).

还有其他问题,例如内部类的序列化形式没有很好地定义.

使所有类可序列化会加剧这些问题.查看Effective Java Second Edition,特别是Item 74:明智地实现Serializable.


@McDowell嗨.我是4年前这个问题的原始海报,我刚刚选择了你的答案,如果它意味着什么.我认为你的答案真的是更好的答案,而且我当时看起来可能太不成熟了.现在修复:)
这显然是更好的答案,我很失望所选择的答案不是这个,似乎发布选择了"我很恼火,因为我必须声明事物可序列化"议程.这是一个想要释放的人的一个例子,而不是注意过去已经学到的安全和设计课程.

2> Pop Catalin..:

我认为这次Java和.Net人都错了,最好是默认情况下将所有内容都序列化,只需要标记那些无法安全序列化的类.

例如,在Smalltalk(70年代创建的语言)中,默认情况下每个对象都是可序列化的.我不知道为什么在Java中不是这种情况,考虑到绝大多数对象可以安全地序列化,而其中只有少数不是.

将对象标记为可序列化(带有接口)并不能神奇地使该对象可序列化,它一直是可序列化的,只是现在你表达了系统可以自己找到的东西,所以我看不出真正的理由.序列化是现在的方式.

我认为设计师或序列化做出的糟糕决定是事后的想法,或者平台从未准备好在所有对象上默认安全地进行序列化.


在设计和实现类时需要特别小心,以确保实例将以合理的方式序列化.可序列化接口实际上意味着:"作为程序员,我已经理解了序列化的后果并允许JVM序列化这个"
@StaxMan,因为后来意识到你需要序列化一个类而你不能,可能会非常昂贵.这是一个很少额外付出的情况之一.如果您正在编写库而其他人将在没有源代码的情况下使用它,则尤其如此
我完全同意这个答案.在许多语言中,一切都是可序列化的.实际上与JVM相同,因为很容易使用Reflection来访问任何类成员,无论它是否是私有的.这个"Serializable"技巧只是十年或两年前的另一个错误决定,而且在处理纯java时又增加了一个烦恼,就像标准库中的收集和字符串处理中的一些缺陷一样.令人高兴的是Kryo,但它是依赖性,需要首先找到它.这就是内置序列化应该如何完成的.

3> Joel Coehoor..:

并非所有东西都是真正可序列化的.例如,采用网络套接字连接.您可以序列化套接字对象的数据/状态,但活动连接的本质将丢失.


有一些不错的方法来处理这种情况,例如编写一个知道如何读取和写入第三方类的关键数据的Serializable包装类; 使包装实例成为瞬态并覆盖writeObject和readObject.

4> Uri..:

Serializable在Java中的主要作用是默认情况下实现所有其他非可序列化的对象.序列化是一种非常危险的机制,尤其是在其默认实现中.因此,就像在C++中的友谊一样,默认情况下它是关闭的,即使它花费一点可以使事物可序列化.

序列化增加了约束和潜在问题,因为结构兼容性没有保证.它默认是关闭的.

我必须承认,我已经看到很少的非平凡类,标准序列化可以实现我想要的.特别是在复杂数据结构的情况下.因此,您需要花费大量时间才能使类序列化,这使得添加接口的成本相形见绌.



5> Michael Borg..:

对于某些类,特别是那些表示更像物理的类,如文件,套接字,线程或数据库连接,序列化实例绝对没有意义.对于许多其他人来说,序列化可能会有问题,因为它会破坏唯一性约束,或者只是强迫您处理类的不同版本的实例,这可能是您不想要的.

可以说,默认情况下使所有Seri​​alizable都可以更好,并通过关键字或标记接口使类不可序列化 - 但是那些应该使用该选项的人可能不会考虑它.它的方式,如果你需要实现Serializable,你会被一个例外告诉你.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有