[解決済み] 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);
デシリアライズ処理(必要であればコールバック)で完全に初期化されることが前提です。
関連
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] コンストラクタ内の仮想メンバー呼び出し
-
[解決済み] リフレクションを使ってジェネリックメソッドを呼び出すにはどうしたらいいですか?
-
[解決済み] あるコンストラクタを別のコンストラクタから呼び出す
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】パディングが無効で、削除できない?
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である