5

重複の可能性:
XML-Serializable クラスにパラメーターなしのコンストラクターが必要な理由

以下に示すように、実行時エラーが発生します。

Message=OutlookAddIn1.DeviceRegistrationRequest は、パラメーターなしのコンストラクターがないため、シリアル化できません。

理由(エラーメッセージに記載されています)と解決方法(空のコンストラクターの簡単な追加)は完全に明らかです。私がはっきりしていないのは、なぜそれが必要なのかということです。このディスカッションを見つけまし たが、主に MVC に関するもので、私のプログラム (CRM Dynamics のコンソール クライアント) とは何の関係もありません。

4

6 に答える 6

7

XmlSerializer使用しているライブラリ(おそらく間接的にのように聞こえます)はそのコンストラクタを予期して使用するため、クラスに必要なのはパラメータのないコンストラクタだけです。これは、オブジェクトを作成するための非常に便利な方法です。

object obj = Activator.CreateInstance(type);

利用方法。

でも!これは、すべてのシリアライザーに固有の要求ではありません。

  • コンストラクターを使用しないシリアライザーがあります(コンストラクターのステップを完全にスキップして、オブジェクトを作成する別の方法があります)
  • 新しいインスタンスを作成するための独自のファクトリメソッドを提供できるシリアライザーがあります
于 2012-09-24T08:31:44.223 に答える
3

いいえ、MVC については何もありません(申し訳ありませんが、私はあなたの投稿を読み違えました)。単純な C#'py オブジェクトの作成についてのみです。ご覧のとおり、このクラスを例に取ります。

public class Why {
    public Why(int x, int y) { }
}

オブジェクトをデシリアライズして構築するときに、デシリアライザーは何を渡すかをどのように知るのでしょうか? 彼は推測できませんでした。したがって、フレームワークでは、シリアル化可能なオブジェクトパラメーターなしのコンストラクターが必要であるため、「作成するだけ」は安全であり、プロパティを介して状態全体を設定可能にするのはユーザーの責任です。

注: ちなみに、コンストラクターは public である必要はないことに注意してください。ほとんどのシリアライザーは、非初期化オブジェクト構築を使用するように実装されている場合、パラメーターなしのプライベート コンストラクターを使用するか、まったく使用しません。これは、少なくとも .Net フル プロファイルで Reflection から利用できます。

于 2012-09-24T08:30:13.477 に答える
1

パラメーター化されたコンストラクターについて何も知らないコードが、パラメーターなしのコンストラクターを使用できるという規則に基づいてオブジェクトの 1 つを構築できるようにするために必要です。

逆シリアル化では、オブジェクト インスタンスが必要であるため、逆シリアル化プロセスはこのコンストラクターを使用してインスタンスを作成します。

于 2012-09-24T08:29:01.693 に答える
1

インスタンスを作成するためのデシリアライズ用。非表示にしたい場合は、プライベートまたは内部コンストラクターを実行できます。

于 2012-09-24T08:30:33.300 に答える
0

報告された問題の詳細を正確に説明するのではなく、一般的に次のように話します。

タイプのオブジェクトを構築できるようにするには、シリアライゼーションにデフォルト が必要です。ctorあなたがそれを持っていないなら、それができる方法はありません。ctor withパラメータに渡す正しいパラメータを把握する方法がないため、「クリア」なパラメータのない ctor が必要です。

于 2012-09-24T08:30:06.207 に答える
0

これは、デシリアライザーがクラスのインスタンスを簡単に作成してデータを入力できる必要があるためです。

パラメーターなしのコンストラクターがない場合、デシリアライザーはコンストラクターに送信するパラメーターを推測する必要があります。コンストラクターが持つべきパラメーターについて従う規則があれば、それはかなりうまく機能しますが、最も簡単な規則は、パラメーターなしのコンストラクターが存在することです。

于 2012-09-24T08:30:55.457 に答える