1. ホーム
  2. c#

[解決済み] DataContractSerializerが私のコンストラクタを呼び出さないのですが?

2023-01-02 14:09:02

質問

オブジェクトをデシリアライズするときに DataContractSerializer はコンストラクタを呼び出さないのです。 !

例えば、このクラスを見てみましょう。

[DataContract]
public class Book
{
    public Book()
    { // breakpoint here
    }

    [DataMember(Order = 0)]
    public string Title { get; set; }
    [DataMember(Order = 1)]
    public string Author { get; set; }
    [DataMember(Order = 2)]
    public string Summary { get; set; }
}

そのクラスのオブジェクトをデシリアライズすると、ブレークポイントはヒットしません。このオブジェクトの唯一のコンストラクタであるため、どのようにして可能なのか全く分かりません!

のため、おそらく追加のコンストラクタがコンパイラによって生成されたのだと仮定しました。 DataContract 属性のためにコンパイラによって追加のコンストラクタが生成されたのだろうと推測しましたが、リフレクションによってそれを見つけることはできませんでした...。

だから、私が知りたいのはこれです:どのようにコンストラクタが呼び出されることなく、私のクラスのインスタンスが作成されるのでしょうか?

注意: 私は OnDeserializing 属性を使用して、デシリアライズの開始時に私のオブジェクトを初期化することができることを知っていますが、これは私の質問の主題ではありません。

どのように解決するには?

DataContractSerializer (例えば BinaryFormatter ) は を使用しません。 コンストラクタを使用しません。それは空のメモリとしてオブジェクトを作成します。

例えば

    Type type = typeof(Customer);
    object obj = System.Runtime.Serialization.
        FormatterServices.GetUninitializedObject(type);

デシリアライズ処理(必要であればコールバック)で完全に初期化されることが前提です。