0

json 文字列を .Net/C# クラス オブジェクト インスタンスに逆シリアル化するためにコンストラクターが必要ないのはなぜだろうか。コンストラクターがまったく呼び出されずに削除され、デシリアライザーがまだ json 文字列からオブジェクト インスタンスを作成していることに驚きました。これは正常ですか?

(ServiceStack の json シリアライザーを使用しています)

4

2 に答える 2

5

ドイツ人の答えは完全に真実ではありません。コンストラクターを実行せずに、デフォルトのコンストラクターを持たないオブジェクトをインスタンス化することは可能です。

これは で行われFormatterServices.GetUninitializedObjectます。

ServiceStack は、既定のコンストラクターが見つからない場合にこのメソッドを使用するため、既定のコンストラクターを持たないオブジェクトを逆シリアル化できます。

于 2014-10-29T15:32:02.423 に答える
2

コンストラクターが指定されていない場合、デフォルト (パラメーターなし) コンストラクターがコンパイラーによって作成されます。コンパイラは、コンストラクタが存在しない場合にのみ、これを行います。クラスで ANY コンストラクターを作成すると、このコンパイラーの動作は適用されなくなります。(何が起こるかを確認するには、少なくとも 1 つのパラメーターを持つコンストラクターを作成してみてください)

逆シリアル化には 2 つの手順が含まれます。デフォルト (パラメーターなし) コンストラクターを使用して空のオブジェクトを作成し、すべての値を設定します。クラスにデフォルト (パラメーターなし) コンストラクターがない場合 (自分で明示的に作成するか、コンパイラーによって作成するかのいずれか)、逆シリアル化は失敗します。

逆シリアル化では、使用する正しいコンストラクターを推測できないため、パラメーター化されたコンストラクターは使用されません。Constructor(String parameter1)例: デシリアライゼーションはとを区別できませんConstructor(String parameter2)

于 2013-07-29T14:10:22.497 に答える