15

我正在为 3 个不同的密码学类实现工厂模式。工厂将确定创建哪个类,然后从数据库中获取正确类的序列化实例并将其返回给请求者。现在我正在序列化这些类以将它们存储在数据库中。我正在为一个名为BouncyCastle. 我可以从文件中创建类和键,但是当我尝试序列化它时,它说两个成员变量,它们是 classPgpPublicKey和的对象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();
}

该类有两个成员变量是问题所在。

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需要存在无参数构造函数才能使序列化工作。

从以下答案:Why XML-Serializable class need a parameterless constructor

在对象的反序列化过程中,负责反序列化对象的类创建序列化类的实例,然后仅在获取要填充的实例后才继续填充序列化的字段和属性。

如果需要,您可以将构造函数设为私有或内部,只要它无参数即可。

于 2013-03-04T22:11:11.730 回答
2

DataContractSerializer 不需要无参数构造函数。相反,它需要的是类的特殊属性。

于 2015-02-23T08:39:42.243 回答
0

PgpPublicKeyPgpPrivateKey类是由你定义的吗?只需向它们添加无参数构造函数。

如果您不想让它们从外部访问,它们可以是私有的。解串器仍然可以访问它们。

于 2013-03-04T22:28:11.447 回答
0

对于几年后仍在寻找的任何人,答案现在是 FormatterServices.GetUninitializedObject。小心它,因为这只是一块设置为所有空值和零的内存,如果对象的默认值中的字段不是零,它可能设置错误:“因为对象的新实例已初始化为零并且没有运行构造函数,则该对象可能不代表该对象认为有效的状态。”

于 2020-01-07T18:00:23.530 回答