json 文字列を .Net/C# クラス オブジェクト インスタンスに逆シリアル化するためにコンストラクターが必要ないのはなぜだろうか。コンストラクターがまったく呼び出されずに削除され、デシリアライザーがまだ json 文字列からオブジェクト インスタンスを作成していることに驚きました。これは正常ですか?
(ServiceStack の json シリアライザーを使用しています)
json 文字列を .Net/C# クラス オブジェクト インスタンスに逆シリアル化するためにコンストラクターが必要ないのはなぜだろうか。コンストラクターがまったく呼び出されずに削除され、デシリアライザーがまだ json 文字列からオブジェクト インスタンスを作成していることに驚きました。これは正常ですか?
(ServiceStack の json シリアライザーを使用しています)
ドイツ人の答えは完全に真実ではありません。コンストラクターを実行せずに、デフォルトのコンストラクターを持たないオブジェクトをインスタンス化することは可能です。
これは で行われFormatterServices.GetUninitializedObject
ます。
ServiceStack は、既定のコンストラクターが見つからない場合にこのメソッドを使用するため、既定のコンストラクターを持たないオブジェクトを逆シリアル化できます。
コンストラクターが指定されていない場合、デフォルト (パラメーターなし) コンストラクターがコンパイラーによって作成されます。コンパイラは、コンストラクタが存在しない場合にのみ、これを行います。クラスで ANY コンストラクターを作成すると、このコンパイラーの動作は適用されなくなります。(何が起こるかを確認するには、少なくとも 1 つのパラメーターを持つコンストラクターを作成してみてください)
逆シリアル化には 2 つの手順が含まれます。デフォルト (パラメーターなし) コンストラクターを使用して空のオブジェクトを作成し、すべての値を設定します。クラスにデフォルト (パラメーターなし) コンストラクターがない場合 (自分で明示的に作成するか、コンパイラーによって作成するかのいずれか)、逆シリアル化は失敗します。
逆シリアル化では、使用する正しいコンストラクターを推測できないため、パラメーター化されたコンストラクターは使用されません。Constructor(String parameter1)
例: デシリアライゼーションはとを区別できませんConstructor(String parameter2)