命令模式持久化和序列化

Command Pattern persistence and Serialization

我想将一系列命令记录到数据存储中并保存它们,以便稍后在存储中重放它们。我有一个命令界面:

interface ICommand { void Execute(); }

我有不同的 类 实现 ICommand,比方说

class Create: ICommand {...}
class Update: ICommand {...}
class Delete: ICommand {...}
class Save: ICommand {...}
...

我可以将 "macro" 作为命令序列:

List<ICommand> macro = new List<ICommand> {...};

现在我想将宏保存在某个地方,例如文件或数据库中的列。我的第一个想法是 XmlSerializer 是将宏移动到流的一种方法。我可以将命令标记为 类 [Serializable],Deserialize 和 Serialize 提供了一种获得持久性的廉价方法,是吗?编号

第一个问题是 类 没有状态会导致空流。例如,Save 命令不接受任何参数,returns 什么也没有。我试图捕获的信息是有一个保存系统状态的请求,我不需要知道我保存的是什么。如果我

ICommand save = new Save();
MemoryStream target = new MemoryStream();
XmlSerializer serializer = new XmlSerializer(typeof(Save));
serializer.Serialize(target, save)
serializer.Deserialize(target);

我遇到异常,因为空字符串没有根。我什至还没有真正开始考虑在我执行反序列化之前需要知道我正在反序列化的命令的类型,或者一旦我设法保存它后如何处理反序列化异构列表。我走错路了吗?有没有更好的方法在 C# 中持久化命令?

对于您遇到的第一个异常, 使用 XmlSeralizer 时需要有根元素 类似的东西

string rootElement = "Command"; 
XmlSerializer s = new XmlSerializer(typeof(Save), new XmlRootAttribute(rootElement));

如果您使用 streamwriter 进行测试,这非常简单,它会起作用。

var save = new Save();
using (StreamWriter writer = new StreamWriter(@"c:\temp\output.xml"))
    s.Serialize(writer, save);

Save getSave = null;
using (StreamReader reader = new StreamReader(@"c:\temp\output.xml"))
    getSave = s.Deserialize(reader) as Save;