7

デフォルトのコンストラクターを使用してオブジェクトの作成を制限したい。私は以下のようなデザインを持っているので:

class Program
{
    static void Main(string[] args)
    {
        BaseClass bc = new BaseClass("","");
        XmlSerializer xml = new XmlSerializer(typeof(BaseClass));
        StreamWriter sw = new StreamWriter(File.Create("c:\\test.txt"));
        xml.Serialize(sw,bc);
        sw.Flush();
        sw.Close();
    }
}
[Serializable]
public class BaseClass
{
    public string UserName, Password;
    // I don't want to create default constructor because of Authentication
    public BaseClass(string _UserName, string _Password)
    {
        UserName = _UserName;
        Password = _Password;
        f_Authenticate();
    }
    private void f_Authenticate() { }
}

public class DerivedClass:BaseClass
{
    public DerivedClass(string _UserName, string _Password) : base(_UserName, _Password)
    {
    }
}

これで結構です。しかし、BaseClass を Serializable にすると、次のエラーが発生します。 Unhandled Exception: System.InvalidOperationException: ConsoleApplication1.BaseC lass cannot be serialized because it does not have a parameterless constructor.

Username、パラメーターが必要なため、デザインが崩壊していPasswordますが、デフォルトのコンストラクターがデザインを台無しにしています....

私は何をすべきか?

4

3 に答える 3

12

プライベート デフォルト コンストラクターを作成する

private DerivedClass()
{
    // code
}

プライベートであっても、シリアライザーはこれを正常に呼び出します

于 2012-04-10T11:58:03.760 に答える
11

インスタンスを逆シリアル化するクラスでは、インスタンスを作成するためにパラメーターなしのコンストラクターが必要ですが、パブリック コンストラクターを実装する必要はありません。パラメーターを必要としない限り、 privateorコンストラクターがあれば十分です。internal

ちなみに、パラメーターなしのコンストラクターを必要とせず、XML も作成するDataContractSerializerを使用することもできます。それは常に私の第一の選択です:-)

于 2012-04-10T11:58:21.440 に答える
1
  • パラメーターなしのプライベート コンストラクターを作成しようとしましたか?

  • パブリックなものが必要な場合は、いつでもコメントして、使用しないでください (最善の解決策ではありません)。

また、Serializable クラスにプロパティを作成する必要があります。変数は考慮されず、シリアライゼーション/デシリアライゼーション プロセス中に読み書きされません。

于 2012-04-10T12:02:16.647 に答える