2012-04-10 8 views
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する作るとき:私はUsernamePasswordパラメータを持っている必要がありますが、デフォルトコンストラクタは、私のデザインを台無しにされているので Unhandled Exception: System.InvalidOperationException: ConsoleApplication1.BaseC lass cannot be serialized because it does not have a parameterless constructor.

は今、私のデザインが崩れている....

何私はする必要がありますか?

+0

実際にすべての可能性を学びたいと思います。もしあなたが私に何を提供したいのですか? – uzay95

+0

重複しているhttp://stackoverflow.com/questions/267724/why-xml-serializable-class-need-a-parameterless-constructor – Matten

答えて

12

serialzerが正常にそれが

+0

いいえ、デフォルトのコンストラクタが必要なため、公にアクセスされます。 –

+1

@TomWijsman Mattenの答えに関するコメントを参照してください。 – Robbie

+1

完全に徹底するために、誤って呼び出すことがないように、[廃止( "デフォルトのコンストラクタは直列化のみです!"、true)]をその専用のコンストラクタに追加できますそれはクラスの中からです。 – yoyo

11

プライベートだにもかかわらず、あなたのインスタンスをデシリアライズクラスはインスタンスを作成するために、パラメータなしのコンストラクタが必要ですが、あなたが持っていない、これを呼び出します

private DerivedClass() 
{ 
    // code 
} 

プライベート既定のコンストラクタを作成します。パブリックコンストラクタを実装するには、パラメータを必要としない限り、privateまたはinternalコンストラクタを持つだけで十分です。

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

+1

これは反射を利用しています – Matten

+0

これは有効であるとは思いませんでしたか?私はそれが公共のコンストラクタを必要とすることが期待されます。これは間違いなく機能しますか?もしそうなら、クール! – Liam

+0

@TomWijsmanno、いいえ、私は非デフォルトのコンストラクタ(OPの例で)を呼び出すことを意味しましたが、私はそれがデフォルトのコンストラクタを呼び出すシリアライザであることを認識しているので、私の答え/コメントを削除しました。 (私が推測する) – Robbie

1
  • プライベートなパラメータのないコンストラクタを作成しようとしましたか?公共の1の必要がある場合

  • することは、あなたは常にあなたはまた、あなたのSerializableをクラスのプロパティを作成する必要が

(最善の解決策ではない)、それは使用すべきではないことを言ってコメントすることができます。変数は考慮されず、シリアル化/脱エステル化プロセス中に読み書きされません。

関連する問題