2016-07-14 5 views
0

私のクラスを構築すると、次のようになりません。C#XMLデシリアライザは、オブジェクトを適切

public class MyClass 
{ 
    private void MyClass() { } //just to satisfy the XML serializer 
    public void MyClass(int a, int b) 
    { 
     A = a; 
     B = b; 
     C = a + b; 
    } 
    public int A { get; set; } 
    public int B { get; set; } 
    public int C { get; private set; } //private set is only to 
             //satisfy the XML Serializer 
    public void DoSomeMath() 
    { 
     Console.WriteLine("{0} + {1} = {2}\n", A, B, C) 
    } 
} 

私は& Bのパラメータを持つ自分のMyClassのオブジェクトをインスタンス化するときに正常に動作しますが、デシリアライザはparamaterlessコンストラクタを呼び出します。別のメソッドを作成せずにCを初期化する方法と、逆シリアル化した後に呼び出す方法はありますか?あなたは、単に似Cのgetterを変更することができ

+0

あなたが各1を使用しているシリアライザこのため、シリアル化イベントがあり異なっているある – Jim

+0

'それは同じ値としてA、BおよびCの値を戻す必要がありますdeseralized System.Xml.Serialization.XmlSerializer' –

+0

それがシリアル化されたとき。したがって、保存時には1、2、3となり、デシリアライズ後に再び1、2、3になるはずです。したがって、あなたのコードには何も問題はありません。 –

答えて

0

デシリアライズは、単に変数を移入します - オブジェクトをインスタンス化するために必要な任意の他のロジックは、プログラムではなく、デシリアライザで実行する必要があります。

public class MyClass 
{ 
    private void MyClass() // NOT just to satisfy the XML serializer 
    { 
     GetStuffReady(); 
    } 

    public void MyClass(int a, int b) 
    { 
     A = a; 
     B = b; 
     GetStuffReady(); 
    } 
    public int A { get; set; } 
    public int B { get; set; } 
    public int C { get; private set; } 

    public void GetStuffReady() 
    { 
     C = A + B; 
    } 

    public void DoSomeMath() 
    { 
     Console.WriteLine("{0} + {1} = {2}\n", A, B, C) 
    } 
} 

いっそ:

public class MyClass 
{ 
     private void MyClass() { } //just to satisfy the XML serializer 
     public void MyClass(int a, int b) 
     { 
      A = a; 
      B = b; 
     } 
     public int A { get; set; } 
     public int B { get; set; } 
     public int C 
     { 
      get 
      { 
       return A + B; 
      } 
      set { } 
     } 
     public void DoSomeMath() 
     { 
      Console.WriteLine("{0} + {1} = {2}\n", A, B, C) 
     } 
    } 

EDIT:このような何かを試してみてください変数はロジックが実行される前に設定する必要がある場合は、クラスの空のインスタンスを作成して設定することができます変数は入力としてXMLをとるヘルパーメソッドを使用します。あなたは、通常のバイナリフォーマッタを使用している場合When is the class constructor called while deserialising using XmlSerializer.Deserialize?

+0

あなたの最初のメソッドを試しましたが、パラメータのないコンストラクタが呼び出されると、AとBは初期化されていないので、 'GetStuffReady()'は失敗します。必要な 'Stuff'を実行するために、パラメータのないインスタンス化の時点で十分なデータがありません。また、「Stuff」には単純な「get」以上のものが含まれているので、それも同様です。 –

+0

高価な操作を一度実行して結果をメモしてみてください。コンストラクタに関係なく、最初の計算を行います。 – Jim

+0

あなたは正しい - ロジックが最初に実行され、次に値が設定されます。空のインスタンスを作成し、XMLを入力とするヘルパーメソッドを使用して変数を設定することができます。追加のロジックは後で同じメソッドで発生する可能性があります。この回答を見る:http://stackoverflow.com/questions/5198431/when-is-the-class-constructor-called-while-deserialising-using-xmlserializer-des –

0

public int C { get { return this.A + this.B; }} 
+0

私は提案を感謝しますが、私は 'a + b'以上のことをしており、それらの計算は' get'に属しません。私はアイデアを伝えるためにコードを言い換えただけです。 –

0

:例えば次のような答えを参照してください

[OnDeserialized] 
public void DoSomeMath() 
{ 
    Console.WriteLine("{0} + {1} = {2}\n", A, B, C) 
} 

XmlSerializerため、イベントはサポートされていません。 IXmlSerializableを実装できますが、それは自明ではありません。 (XMLにシリアライズ)DataContractSerializerについては

あなたは試みることができる:

[OnDeserializing] 
public void OnDeserializing(StreamingContext context) 
{ 
    ... // logic here. 
} 

あり、ここでXmlSerializerに答えはあるが、それはデフォルトのものを継承が必要です。
How do you find out when you've been loaded via XML Serialization?

関連する問題