【问题标题】:Command Pattern persistence and Serialization命令模式持久化和序列化
【发布时间】:2015-05-08 01:16:03
【问题描述】:

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

interface ICommand { void Execute(); }

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

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

我可以将“宏”制作成一系列命令:

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

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

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

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

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

【问题讨论】:

    标签: c# serialization macros


    【解决方案1】:

    对于您遇到的第一个异常, 使用 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;
    

    【讨论】:

    • new XmlSerializer 将在每次调用时创建新的序列化程序集。缓存它
    猜你喜欢
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多