将ValueObject序列化为XML

时间:2017-01-03 13:56:38

标签: c# domain-driven-design

您会认为这是一个非常简单的问题。但经过大量的搜索和测试后,我还没有找到一个漂亮的解决方案。

根据域驱动设计,我创建了强类型标识符类。因为这有助于验证,而不是意外地混淆标识符。

所以我创建了一个简单的基类:

public abstract class UIDBase<T> 
{
    private readonly T _id;

    protected UIDBase(T id)
    {
        _id = id;
    }

    public T ID
    {
        get { return _id; }
    }

    // Plus hash/equals implementation

}

这样的简单实现:

public class SensorUID : UIDBase<string>
{
    public SensorUID(string id) : base(id)
    {
    }
}

然后我用它:

public class SomeObject
{
    public SensorUID SensorUID { get; set; }

    public FileName FileName { get; set; }
}

但现在当我将其序列化为XML时,我需要一个默认构造函数(烦人)。但更糟糕的是,属性不再被序列化为属性。

首选我只想将自定义Xml序列化代码添加到我的UIDBase类中。添加属性或实现接口以告知xml序列化程序应将这些类序列化为属性。就像string / int / long等一样。

如果这些值类型可以做到,为什么不是我自己的值类型?

Xml应如下所示:

<SomeObject SensorUID="X" FileName="Y"/>

1 个答案:

答案 0 :(得分:0)

这似乎有效,但感觉很难看:

public class SomeObject
{
    [XmlIgnore]
    public SensorUID SensorUID { get; set; }

    [XmlIgnore]
    public FileName FileName { get; set; }

    [XmlAttribute("SensorUID")]
    public string SensorUIDAsString
    {
        get { return SensorUID == null ? null : SensorUID.ID; }
        set { SensorUID = new SensorUID(value); }
    }

    [XmlAttribute("FileName")]
    public string FileNameAsString
    {
        get { return FileName == null ? null : FileName.ID; }
        set { FileName = new FileName(value); }
    }
}