【问题标题】:what are the disadvantages of making a class serializable in java [closed]在java中使类可序列化有什么缺点[关闭]
【发布时间】:2013-05-28 09:55:26
【问题描述】:

我想知道在java中使类可序列化的缺点;

在内存分配和可访问性方面的缺点。

有关此主题的任何链接都会有所帮助

提前致谢。

【问题讨论】:

  • 大对象也会显着增加应用程序的内存需求,因为对象输入/输出流会缓存对写入流或从流中读取的所有对象的实时引用,直到流关闭或重置。因此,这些对象的垃圾收集可能会被过度延迟。
  • 实现Serializable接口有4个缺点请参考下面的链接了解更多详情jusfortechies.com/java/core-java/externalization.php

标签: java memory serialization


【解决方案1】:

内存分配方面的缺点

零。

和可访问性

零。我不明白这个问题,但答案仍然是零。

如果您不希望特定类成员被序列化,您始终可以将其设为瞬态,这将节省与包含该成员的类相关的任何序列化开销。

implements Serializable 的行为本身的负面后果为零。

我不知道你所说的“安全”是什么意思,但是使用序列化进行深拷贝肯定有效。

【讨论】:

  • 我知道它会起作用;我已经用演示程序进行了测试;但是我害怕降低应用程序的性能,因为我使用的对象结构非常复杂。我想我必须在真实的​​应用程序中测试它;无论如何,再次让你陷入困境......
  • 新功能的“性能下降”是没有意义的。你没有任何东西可以与之比较。
【解决方案2】:

如果您查看 Java 及其会话对象,则会使用纯对象序列化。
假设应用程序会话相当短暂,即最多几个小时,对象序列化很简单,得到很好的支持,并且内置在 Java 会话概念中。
但是,当数据持久性持续较长时间(可能是几天或几周)并且您不得不担心应用程序的新版本时,序列化很快就会变得邪恶。
正如任何优秀的 Java 开发人员都知道的那样,如果您打算序列化一个对象,即使在会话中,您也需要一个真正的序列化 ID (serialVersionUID),而不仅仅是一个 1L,并且您需要实现 Serializable 接口。
但是,大多数开发人员并不了解 Java 反序列化过程背后的真正规则。
如果您的对象发生了变化,不仅仅是向对象添加简单的字段,即使序列化 ID 没有更改,Java 也可能无法正确反序列化对象。
突然之间,您无法再检索您的数据,这本来就是不好的。

请访问https://softwareengineering.stackexchange.com/questions/191269/java-serialization-advantages-and-disadvantages-use-or-avoid

【讨论】:

  • 但是请注意,引用不是来自programmers.stackexchange.com,而是来自DZone 文章Is Object Serialization Evil?。关于“不仅仅是1L”的部分不正确。
【解决方案3】:

实际上,我能想到的唯一缺点是为对象公开了一个伪构造函数。 例如,如果你让一个经典的单例可序列化,你还应该引入一个 'readResolve' 方法。
除此之外,没有缺点。

关于深拷贝,您应该使用 Clonable 工具,因为它使用本机 memcpy 工作得更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    相关资源
    最近更新 更多