2013-03-04 171 views
6

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

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

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

制作您自己的数据类以进行序列化,根据需要复制值 – 2013-03-04 22:09:30

+1

为什么您不想只添加无参数构造函数? – Restuta 2013-03-04 22:09:47

回答

25

任何序列化器类需要一个参数的构造函数,因为反序列化它创建一个空的新实例,然后将其复制从seialized数据采取一切公共财产。

如果您想避免在没有参数的情况下创建构造函数,您可以轻松地将构造函数设置为私有的。

EX:

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

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

我试过私人无参构造函数,它不适合我。我需要公开它正确地反序列化 – 2017-11-09 19:08:48

3

是,XmlSerializer的需要参数的构造函数,以便存在序列化工作。

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

在对象的反序列化,该类负责 反序列化对象创建序列化类 的一个实例,然后继续填充序列化的字段和属性 只有在获取实例后才能填充。

如果你愿意,你可以让你的构造函数是私有的或内部的,就像它的无参数那么长。

0

PgpPublicKeyPgpPrivateKey你定义的类吗?只需添加无参数构造函数即可。

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

1

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

相关问题