2013-03-04 2 views
6

私は3つの異なる暗号クラスのファクトリパターンを実装しています。ファクトリは、どちらを作成するかを決定し、データベースから正しいクラスのシリアル化されたインスタンスを取得し、リクエスタに返します。 今、私はデータベースにクラスを格納するためにクラスをシリアル化する作業をしています。私はBouncyCastleと呼ばれるPGP暗号化クラスのためのものを書いています。クラスとキーをファイルから作成できますが、直列化しようとすると、パラメータがないコンストラクタがないため、クラスPgpPublicKeyおよびPgpPrivateKeyのオブジェクトである2つのメンバ変数を直列化できません。C#パラメータのないコンストラクタなしでクラスをシリアライズ

public void createdBouncyFromFiles() 
{ 
    var bc = new BouncyCastle("C:\\TestFiles\\BouncyPublicKey.txt", "C:\\TestFiles\\BouncyPrivateKey.txt", "Password1"); 
    var xmlSerializer = new XmlSerializer(bc.GetType()); 
    var textWriter = new StringWriter(); 
    xmlSerializer.Serialize(textWriter, bc); 
    var theSerializedClass = textWriter.ToString(); 
} 

クラスには2つのメンバー変数があります。

public class BouncyCastle : ICryptographyProvider 
{ 

    public PgpPublicKey m_publicKey; 
    public PgpPrivateKey m_privateKey; 
    public string m_passPhrase; 
    // cut out the irelevant parts 

これは公開鍵クラスです。パラメータのないコンストラクタはありません。

public class PgpPublicKey 
{ 
    public PgpPublicKey(PublicKeyAlgorithmTag algorithm, AsymmetricKeyParameter pubKey, DateTime time); 
    // cut other methods 
} 
+1

シリアル化し、必要に応じて値をコピーする独自のデータクラスを作成します –

+1

なぜパラメータのないコンストラクタを追加したくないのですか? – Restuta

答えて

25

どれシリアライザクラス、それはコピーし、その後、それが空の新しいインスタンスを作成しますseializedデータから取られたすべてのパブリックプロパティをデシリアライズながら、ので、パラメータなしのコンストラクタが必要です。

パラメータなしで作成しないようにするには、コンストラクタを簡単にプライベートにすることができます。

EX:

public class PgpPublicKey 
{ 
    public PgpPublicKey(PublicKeyAlgorithmTag algorithm, AsymmetricKeyParameter pubKey, DateTime time); 

    private PgpPublicKey(); 
    // cut other methods 
} 
+0

私はプライベートなパラメータのないコンストラクタを試してみましたが、それは私のためにそのように動作しません。私はそれが適切に非直列化するために公開する必要があります –

3

はい、のXmlSerializer はシリアライゼーションが機能するために存在するパラメータなしのコンストラクタを必要とします。次の答えから

:オブジェクトのデシリアライズ時にWhy XML-Serializable class need a parameterless constructor

、 デシリアライズオブジェクトを担当するクラスは、直列化されたクラス のインスタンスを作成し、シリアル化されたフィールドを入力して進み、プロパティ は、移入するインスタンスを取得した後にのみ表示されます。

必要に応じてコンストラクタをプライベートまたは内部にできます。それでは はパラメータなしです。

0

PgpPublicKeyPgpPrivateKeyあなたが定義するクラスはありますか?パラメータのないコンストラクタを追加するだけです。

外部からアクセスできないようにする場合は、プライベートにすることができます。デシリアライザは引き続きそれらにアクセスできます。

1

DataContractSerializerには、パラメータのないコンストラクタは必要ありません。その代わりに必要なのは、クラスの特別な属性です。

関連する問題