2017-01-03 4 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としてそれをシリアル化し、私はデフォルトのコンストラクタ(迷惑な)が必要です。しかし、悪いことに、プロパティはもはや属性としてシリアル化されません。

私はUIDBaseクラスにカスタムXmlシリアル化コードを追加したいだけです。属性を追加するか、またはインターフェイスを実装して、これらのクラスを属性としてシリアル化する必要があることをXMLシリアライザに伝えます。文字列/ int/longなどのように。

これらの値の型がそれを行うことができます、なぜ自分の値の型ですか?

XMLは次のようになります。

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

あなたは[このMSDNのドキュメント](https://msdn.microsoftを見て提案します.com/ja-us/library/83y7df3e(v = vs.110).aspx) – user957902

+0

私はそれを調べます。私はSystem.stringが同じことを引き出す方法を知るために.netのソースコードに潜入していました。私はこの質問に自分自身で答えるかもしれません;) –

+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); } 
    } 
} 
関連する問題