1.实现命令
-
!s filename
保存文件的时候,需要保存符号表的信息,变量表的信息(符号表中包含了函数名和变量名信息,变量表中包含了变量名的值)。
所以,SymbolTable类, Storage类是可序列化的类,可以保存到文件中,也可以把它加载到相应的对象中。Calc类也应该是可序列化的类,因为Calc类包含了SymbolTable类, Storage类。所以在序列化时,只需要调用Calc类的序列化,然后再调用SymbolTable类, Storage类的序列化。 -
!l filename
2.序列化
-
Serializer和DeSerializer类:对文件操作的基础类
-
SymbolTable类序列化
-
Storage类序列化
-
Calc类序列化
-
可序列化的类,能够将类对象保存到文件中(叫做序列化),也能从文件中加载数据还原对象(叫做反序列化)
序列化相关的类关系如下:
Serializer和DeSerializer类是基础类;
SymbolTable类,Storage类,Calc类都是可序列化的类,都继承至Serializable类;
Serializable类又依赖于Serializer和DeSerializer类(依赖关系具有使用的语义),在读写文件的时候,使用这俩基础类来读写文件;
eg:Storage类使用Serializer基础类来保存数据,写入的格式方法由Serializable类中的Serialize方法决定,该函数是虚函数,Storage类会覆盖这个方法,提供这个方法的实现,决定数据该如何写入到文件中,但是使用的是Serializer基础类来写文件。按照什么样的格式写入数据,是由Serialize方法方法提供的,该方法会调用Serializer基础类的相关接口来写文件,调用接口的顺序由Serialize方法决定,调用的函数不同,那么写入文件的格式是不一样的
-
使用StartUML画类图
-
eg:
P67\Calculator\Serial.h,P67\Calculator\Serial.cpp
class Serializable
{
public:
virtual void Serialize(Serializer& out) const = 0;
virtual void DeSerialize(DeSerializer& in) = 0;
};
P67\Calculator\SymbolTable.h,P67\Calculator\SymbolTable.cpp
P67\Calculator\Storage.h,P67\Calculator\Storage.cpp
P67\Calculator\Calc.h,P67\Calculator\Calc.cpp
void Serialize(Serializer& out) const;
void DeSerialize(DeSerializer& in);
- 测试:
当前的变量表
符号表
保存文件
关闭程序后,重新加载变量表