gpt4 book ai didi

java - 接受默认序列化时封装如何被破坏?

转载 作者:搜寻专家 更新时间:2023-11-01 03:24:53 25 4
gpt4 key购买 nike

我经常听到人们说序列化破坏了封装,而这种封装损失可以通过提供自定义序列化在某种程度上最小化。有人可以提供一个具体的例子来证明由于默认序列化导致的封装损失是合理的吗?如何通过自定义序列化来最小化这种损失?

我将这个问题标记为与 Java 相关,但答案可能与语言无关,因为我认为这是跨平台和语言的常见问题。

最佳答案

好问题!首先,让我们定义封装并从那里开始。 This wikipedia article通过以下方式定义封装:

  • 一种语言机制,用于限制对某些对象组件的访问。
  • 一种语言结构,有助于将数据与操作该数据的方法(或其他函数)捆绑在一起。

序列化,至少是 Java 的方式,对这两个概念都有影响。当您在 Java 中实现 Serializable 接口(interface)时,您实质上是在告诉 JVM 您的所有非 transient 成员变量及其声明顺序通过以下方式定义契约哪些对象可以从字节流中重建。当且仅当您的所有成员变量的类定义也实现了 Serializable 时,这才递归地工作,而这正是您可能遇到麻烦的地方。

封装问题

根据前面对封装的定义,尤其是第一项,封装使您无法了解所处理的对象在其成员变量方面的实际工作原理。 “正确地”实现 Serializable 会迫使作为开发人员的您对正在处理的对象的了解比您在功能意义上可能关心的要多。从这个意义上说,实现Serializable直接反对封装。

自定义序列化

在任何情况下,序列化都需要了解哪些数据构成了特定类型的“对象”。 Java 的 Serializable 接口(interface)通过强制您了解您希望序列化的每个 Object 的每个成员变量的 transient 状态,将这一点发挥到了极致。您可以通过在需要序列化的类型之外定义一个序列化机制来解决这个问题,但是会有设计权衡 - 例如您可能需要在它们实现的接口(interface)级别处理对象,而不是直接与它们的成员变量交互,并且您可能会失去一些从序列化字节流重建确切对象类型的能力。

关于java - 接受默认序列化时封装如何被破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17069253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com