2017-01-03 23 views
0

您會認爲這是一個非常簡單的問題。但經過大量搜索和測試後,我還沒有找到一個漂亮的解決方案。將ValueObject作爲XML序列化

根據域驅動設計,我創建了強類型標識符類。因爲這有助於驗證並且不會意外混合標識符。

所以我做了一個簡單的基類,像這樣:

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"/> 
+0

建議你看看[這個MSDN文檔(https://msdn.microsoft .com/en-us/library/83y7df3e(v = vs.110).aspx) – user957902

+0

我會研究它。我也潛入.net源代碼,看看System.string如何將相同的東西關閉。我可以自己回答這個問題;) –

+1

域實體應該是持久的無知。你的實體不是。資源庫的責任是將實體正確地保存到XML(或代表您的域實體的DTO)。 – jgauffin

回答

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); } 
    } 
}