Java中的io.Serializable是什么意思?它与备忘录模式有什么关系?

8

众所周知,备忘录模式可以在不违反封装的情况下,捕获和外部化对象的内部状态,并且可以在没有原始状态知识的情况下稍后回收。

我的问题是,为什么 java.io.Serializable 会涉及到这个模式?因为每当我们对一个私有变量进行序列化并将对象状态写入文件时,私有变量的值就公开给了全世界,这里似乎出现了封装失效的情况。


维基百科上关于备忘录模式的文章中并未出现“封装”一词。 - Andre Holzner
@Andre,请参考下面的链接。http://www.javacamp.org/designPattern/ - BOSS
这是另一个供您参考的链接。http://sourcemaking.com/design_patterns/memento - BOSS
2
《设计模式》一书明确提到了封装性。它进一步解释说,备忘录应该对除了原始类之外的所有人都是“不透明”的。 - Adam
1
@advs89,这是否意味着如果它由不同的类(例如XML框架)序列化,就不应该使用它进行序列化? - z0r
显示剩余2条评论
3个回答

4

备忘录模式的维基百科文章并没有提到封装,事实上,那里给出的例子恰好捕捉了备忘录中保存在私有变量中的状态。

封装(“一种语言机制,用于限制对象组件的访问”)是指您必须编写代码才能更改对象的内部状态。

但是,对象的内部状态可能已由外部输入确定,例如字符串的内容取决于读取它的文件或从网络接收的数据。复选框的状态取决于用户是否选中它,而类中相应的字段可能具有私有访问权限,并且对其他类来说状态可能是只读的。

通过将字段放置在私有访问下来保护它们,旨在帮助开发人员使对象的状态保持一致,即避免来自该类之外的代码将字段设置为不一致的状态(例如,如果字段A的值取决于字段B的值)。

这与“隐私”无关,因为这些数据被认为是机密的。当然,可以编写另一个类,然后读取序列化的私有字段,并在不同的类中公开它们,或者甚至可以编辑序列化的文件,但我不确定这样做会有什么好处。


1
+1。封装意味着类不允许程序中的其他实体直接访问和修改数据/方法。如果封装意味着完全而非部分的不透明性,那么将其私有数据成员保存到文本文件中的类会是什么?违反封装原则的行为吗?事实上,这意味着所有面向对象数据库管理系统都将违反封装。那会使O-O专家感到非常恼火 :-) - 2rs2ts

1

我理解备忘录模式并没有规定备忘录/令牌本身的格式、透明度或安全性。备忘录的格式(人类可读、完全加密或介于两者之间)与模式本身无关。

我认为序列化(XML或二进制)是备忘录实现的一个很好的例子。它暴露对象内部可能意味着它不是您项目的最佳实现方式。但是,它仍然是该模式的有效实现。 :)


0

来自维基百科的封装文章:在编程语言中,封装用于指代两个相关但不同的概念,有时还包含两种概念的组合:

  • 一种限制对象部分组件访问的语言机制。
  • 一种语言结构,可以方便地将数据与操作该数据的方法(或其他函数)捆绑在一起。

来自不透明对象文章:内容是不透明的,通常要等到接收者在稍后时间将cookie (或我们的情况下对象)数据传回给发送者或另一个程序时才解释。

封装没有被破坏。备忘录模式防止看护者对象更改备忘录对象,使得原发器可以将其用于回滚或其他实用工具。


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