谁应该负责膨胀数据对象?

时间:2011-10-16 23:32:52

标签: c# .net serialization

在我当前的项目中,我有很多对象需要持久化到XML并在运行时膨胀。我一直在通过.NET的DataContracts来管理它。我现在正在做的是创建一个单独的类,它代表我正在序列化的对象以及从盘中读取/写入这些对象,以避免在单个类中承担太多责任。这是一个例子:

public class Range
{
    private float _min;
    private float _max;

    public float Min { get { return this._min; } }
    public float Max { get { return this._max; } }

    // Constructrs & Methods...

    public SerializedRange GetAsSerializable();
}

Range课程有免费课程:

[DataContract]
public class SerializedRange
{
    [DataMember]
    public float Min;

    [DataMember]
    public float Max;

    // Constructor...
}

我的问题是,谁应该负责实际获取对象的序列化版本并将其膨胀为实际对象?我看到三个选项,但我不确定哪个(如果有的话)是最好的:

  1. 使用姐妹类的可用构造函数/工厂,为对象的序列化版本提供一个实例方法,该方法使用膨胀的实例进行吐出。
  2. 给姐妹班一个工厂,该工厂采用序列化版本的实例来构建自己。
  3. 没有类或者它的Serializable对应物做任何事情 - 使用在Serialized对象中读取的代码,使用他们经常拥有的任何构造函数/工厂手动创建常规对象。
  4. 我意识到在某些情况下你必须以某种方式做到这一点,因为除了这个有点人为的例子之外的限制。因为有更多的方法可以做到这一点,我真正想要的是一个通用的经验法则,产生整洁,可读和可扩展的代码。

1 个答案:

答案 0 :(得分:2)

如果你“打破”你应用到组成部分你会得到什么逻辑组件?根据我的理解,这里有一些:

  1. 域对象(您正在存储的数据)
  2. 数据层 - 负责持久保存数据(并检索数据)
  3. 和其他许多人(但根据你的描述只采取了一个子集)

    现在,数据层的工作是将内容写入某些存储 - 在您的情况下将XML文件写入磁盘。

    现在,当您'查询'提取它的文件?数据层。谁应该填充相应的域对象?那么数据层本身。

    数据层是否应该将人口责任委托给单独的班级/工厂?这取决于它是否会被其他人重复使用。如果没有,像内部类这样的概念可以提供很好的帮助(它们存在于java世界中,不确定它在C#.NET中是否相同)。这样你就可以将它模块化到一个特定的类中,除非你想要那样,否则它不会被其他类公开显示。

    你应该去工厂吗?是的你可以。但要确保这样做在逻辑上是正确的。您可以使用许多对象填充器 - 这可以将通胀功能隔离到一个类,工厂本身可以成为数据层的一部分(如果您希望这样)。

    一旦你描述了这些问题,你就可以更好地决定把这段代码放在哪里。我已经提供了一些可以派上用场的指示。

    希望它有所帮助...