15

3 つの異なる暗号化クラスのファクトリ パターンを実装しています。ファクトリは、作成するものを決定し、データベースから正しいクラスのシリアル化されたインスタンスを取得して、リクエスタに返します。現在、クラスをシリアル化してデータベースに格納する作業を行っています。という名前の PGP 暗号化クラス用に作成していBouncyCastleます。ファイルからクラスとキーを作成できますが、シリアル化しようとすると、クラス と のオブジェクトである 2 つのメンバー変数は、PgpPublicKeyパラメーターなしのPgpPrivateKeyコンストラクターがないため、シリアル化できないと表示されます。

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
}
4

5 に答える 5

33

シリアライザ クラスにはパラメータなしのコンストラクタが必要です。これは、デシリアライズ中に空の新しいインスタンスを作成し、シリアル化されたデータから取得したすべてのパブリック プロパティをコピーするためです。

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

元:

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

    private PgpPublicKey();
    // cut other methods
}
于 2013-03-04T22:11:04.893 に答える
5

はい、XmlSerializerでは、シリアル化が機能するために、パラメーターなしのコンストラクターが存在する必要があります。

次の回答から: XML-Serializable クラスにパラメーターなしのコンストラクターが必要な理由

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

必要に応じて、パラメーターがない限り、コンストラクターをプライベートまたは内部にすることができます。

于 2013-03-04T22:11:11.730 に答える
2

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

于 2015-02-23T08:39:42.243 に答える
0

PgpPublicKeyとクラスはあなたPgpPrivateKeyによって定義されていますか? パラメーターなしのコンストラクターをそれらに追加するだけです。

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

于 2013-03-04T22:28:11.447 に答える