1. 记录状态
  2. 便于回滚
  3. 有个源对象,可以使用memento来记录一下他的状态
  4. 一般用于记录快照(瞬时状态)和存盘
  5. 将快照存到一对象中,直接存在硬盘上也许(坦克大战游戏存档,给坦克代码加入存盘功能)
  6. gof中的例子是画图软件,一次操作之后,后悔了,想要再回到之前的状态(之前的状态即为快照,可以存在备忘录中)
  7. 与回退命令模式有点像,经常一起用

UML类图

image.png

给坦克代码加入存盘功能

  • 必须实现重要接口Serializable(标记接口 ),否则使用序列化会报异常
  • 对象序列化、持久化
  • 将内存中的对象原封不动的写到硬盘上去
  • ObjectOutputStream传入FileOutputStream变量(打开文件的输出流),再用ObjectOutputStream调用writeObject(对象)方法(writeObject特征更鲜明)readObject();需要强转……
  • 加transient关键字,表示该变量不需要序列化
    • 疑问:transient序列化时忽略,那反序列化时会为空还是会报错(为空!)(关键字用了不会报错)
  • 或者都实现序列化接口
  • save是保存某一时刻的状态,而load是将存档赋值给程序中的变量(要注意顺序一致!!!
    1. 记录对象的某个瞬间
    2. 类似照片

关闭流的规范写法

image.png

序列化的其他用途

  • 网络传输Java Bean
  • 但现在一般不用Serializable,而是用谷歌开源的ProtoBuf来进行序列化
  • 因为java的序列化体量很大,序列化结果带有很多乱七八糟的关于类的属性的一些内容
  • 谷歌的和Java的体量比大概在1:2~3