2011-10-26 11 views
9

私はクラスを持っている:XDocumentを使用するコンストラクタを使用してXMLをオブジェクトに逆シリアル化するにはどうすればよいですか?

public class MyClass 
{ 
    public MyClass(){} 
} 

私は、このようにコンストラクタで直接XDocumentをデシリアライズするためにXMLSeralizerを使用できるようにしたいと思います:

public class MyClass 
{ 
    private XmlSerializer _s = new XmlSerializer(typeof(MyClass)); 

    public MyClass(){} 
    public MyClass(XDocument xd) 
    { 
     this = (MyClass)_s.Deserialize(xd.CreateReader()); 
    } 
} 

私はに割り当てることが許可されていないのです除き "これはコンストラクタ内にあります。

これは可能ですか?

+0

あなたがそのようにそれをやりたい理由? – Fischermaen

+0

クラスをインスタンス化し、それにXDocumentを与えて、それを自分のように設定しておけばいいです。他にも解決策がありますが、これは私にとって最もエレガントなようです...私はより良い提案にはオープンしています。 –

+0

データをシリアル化してインスタンスを作成するようにクラスを設定できませんか? – Yatrix

答えて

26

いいえ、不可能です。シリアライザは、デシリアライズ時にオブジェクトを作成します。すでにオブジェクトを作成しています。代わりに、XDocumentから構築する静的メソッドを提供してください。

public static MyClass FromXml (XDocument xd) 
{ 
    XmlSerializer s = new XmlSerializer(typeof(MyClass)); 
    return (MyClass)s.Deserialize(xd.CreateReader()); 
} 
+0

と、コンパイル時にextraTypes(knownTypes)がわからないときの冷蔵庫の仕組みは?これは悪意のある、私たちは初期化する前に前もってコールバックを持っていません。逆シリアル化を開始する前に? –

6

スタティックロード方式を使用する方がより標準的です。

public class MyClass 
{ 
    public static MyClass Load(XDocument xDoc) 
    { 
     XmlSerializer _s = new XmlSerializer(typeof(MyClass)); 
     return (MyClass)_s.Deserialize(xDoc.CreateReader()); 
    } 
} 
3

例えば、工場のいくつかの種類を使用する:

public static MyClass Create(XDocument xd) 
{ 
    XmlSerializer _s = new XmlSerializer(typeof(MyClass)); 
    return (MyClass)_s.Deserialize(xd.CreateReader()); 
} 
-1

あなたの質問に簡単な答えはありません、することはできませんで、より良いです。そのため、デシリアライズするときにオブジェクトを作成する必要があります。

しかし、実際にオブジェクトが話すこと自体を話す可能性を主張する場合は、非直列化後に取得するオブジェクトでロードできるプライベート静的インスタンス変数を使用できます。

例(それがnullではない場合)他の公共のメンバーは、インスタンス上で動作するはずです(私の頭のうち、それは完全に間違っていわずかなチャンスがあります):

public class MyClass 
{ 
    private XmlSerializer _s = new XmlSerializer(typeof(MyClass)); 
    private static MyClass mInstance = null; 

    public MyClass() { /* initialization logic */ } 
    public MyClass(XDocument xd) 
    { 
     mInstance = (MyClass)_s.Deserialize(xd.CreateReader()); 
    } 

    public void DoSomething() 
    { 
    if (mInstance != null) 
     mInstance.DoSomething(); 
    else 
    { 
     // logic for DoSomething 
    } 

    } 
} 
は、

これは少しはっきりしてくれることを願っていますが、私はそのようなデザインが好きではありません。私はそれが過度に複雑でエラーに敏感になると思う。

+0

あなたは、最初にインスタンス化したすべてのMyClassが静的なインスタンスの以前のインスタンス化を置き換えることに気づきましたか?インスタンス化されたMyClassオブジェクトはすべて、メモリ内の同じオブジェクトを使用します。 – SamuelWarren

1

私は同じことをやってみたかったし、次の操作を行うことを決めた。

public class MyClass 
{ 
    public MyClass(){ 
    } 

    public MyClass(XDocument xd) 
    { 
     var t = typeof(MyClass); 
     var o = (MyClass)new XmlSerializer(t).Deserialize(xd.CreateReader()); 

     foreach (var property in t.GetProperties()) 
      property.SetValue(this, property.GetValue(o)); 
    } 
} 
関連する問題