【问题标题】:Integration of Serialization and Deserialization in Builder Design Pattern using C#使用 C# 在 Builder 设计模式中集成序列化和反序列化
【发布时间】:2011-05-19 15:29:57
【问题描述】:

我正在实现Builder Pattern 以生成一组对象。然后必须将这些对象序列化为 XML 并从 XML 反序列化。

我知道如何执行序列化和反序列化,但是我不确定如何将其集成到设计模式中。

例如,假设我的代码使用构建器来创建产品 foo 和 bar。我的第一个想法是在每个产品上都设置一个序列化函数,因为每个产品都知道要序列化什么。

我的下一个想法是将反序列化放在 Director 或 ConcreteBuilder 中。

我不喜欢的是序列化和反序列化函数将位于不同的位置 - 一个在文件中用于声明 foo 和 bar 对象,另一个在文件中用于其他内容。我担心在我处理产品类时它们最终可能会变得不同步。

我最后的想法是让 Director 或 ConcreteBuilder 执行序列化和反序列化。我不喜欢的是产品必须知道使用了哪个构建器或知道导演是谁。

澄清一下 - 可以创建产品的情况有两种:

  1. 用户点击用户界面中的按钮
  2. 用户加载一个 XML 项目

【问题讨论】:

    标签: c# xml design-patterns


    【解决方案1】:

    你不能简单地拥有一个静态序列化/反序列化类并创建一个可以接受任何类型对象的通用方法吗?模式不只是用于构建对象吗?然后就可以随意序列化了吗?

    类似:

    public static string Serialize<T>(T data)
        {
           XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
           StringWriter sw = new StringWriter();
           xmlSerializer.Serialize(sw, data);
           return sw.ToString();
    
        }
    

    【讨论】:

    • 好主意,但是我手动执行 XML 序列化和反序列化,因为我一直遇到自动方法的太多限制。我还需要在反序列化后触发事件并设置与用户项目状态相关的标志。
    【解决方案2】:

    我目前的解决方案是让 Product 执行序列化,ConcreteBuilder 执行反序列化,然后将 Product 和它的 ConcreteBuilder 声明放入同一个源文件中。

    尽管任务分散在两个类中,但至少保存在一个文件中。

    感谢任何更好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 2021-01-13
      • 2012-02-02
      • 2018-01-06
      • 1970-01-01
      相关资源
      最近更新 更多