- 记录状态
- 便于回滚
- 有个源对象,可以使用memento来记录一下他的状态
- 一般用于记录快照(瞬时状态)和存盘
- 将快照存到一对象中,直接存在硬盘上也许(坦克大战游戏存档,给坦克代码加入存盘功能)
- gof中的例子是画图软件,一次操作之后,后悔了,想要再回到之前的状态(之前的状态即为快照,可以存在备忘录中)
- 与回退命令模式有点像,经常一起用
UML类图
给坦克代码加入存盘功能
- 必须实现重要接口Serializable(标记接口 ),否则使用序列化会报异常
- 对象序列化、持久化
- 将内存中的对象原封不动的写到硬盘上去
- ObjectOutputStream传入FileOutputStream变量(打开文件的输出流),再用ObjectOutputStream调用writeObject(对象)方法(writeObject特征更鲜明)readObject();需要强转……
- 加transient关键字,表示该变量不需要序列化
- 疑问:transient序列化时忽略,那反序列化时会为空还是会报错(为空!)(关键字用了不会报错)
- 或者都实现序列化接口
- save是保存某一时刻的状态,而load是将存档赋值给程序中的变量(要注意顺序一致!!!)
记录对象的某个瞬间
类似照片
关闭流的规范写法
序列化的其他用途
- 网络传输Java Bean
- 但现在一般不用Serializable,而是用谷歌开源的ProtoBuf来进行序列化
- 因为java的序列化体量很大,序列化结果带有很多乱七八糟的关于类的属性的一些内容
- 谷歌的和Java的体量比大概在1:2~3