C#序列化一个没有无参数构造函数的类

标签 c# serialization bouncycastle

我正在为 3 个不同的加密类实现一个工厂模式。工厂将确定创建哪一个,然后从数据库中获取正确类的序列化实例并将其返回给请求者。 现在我正在对类进行序列化以将它们存储在数据库中。我正在为名为 BouncyCaSTLe 的 PGP 加密类编写一个。我可以从文件创建类和 key ,但是当我尝试序列化它时,它说两个成员变量,它们是类 PgpPublicKeyPgpPrivateKey 的对象,无法序列化,因为它们没有无参数构造函数。

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
}

最佳答案

任何序列化器类都需要一个无参数的构造函数,因为在反序列化时它会创建一个空的新实例,然后它会复制从序列化数据中获取的每个公共(public)属性。

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

例如:

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

    private PgpPublicKey();
    // cut other methods
}

关于C#序列化一个没有无参数构造函数的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15212051/

相关文章:

java - 如何创建TBase类实例

java - 如何使用 eclipse 在 J2ME 中使用 bouncy caSTLe API?

c# - 无法加载文件或程序集错误 - 寻找错误的计算机

c# - DataGridView 中的 ColumnCount 和 Columns.Count 有什么区别

c++ - boost 串行器 : getting warning C4308 unless using virtual class destructor

java - X500Principal Distinguished Name 命令

c# - 使用使用 BouncyCaSTLe AesFastEngine 加密的 C# AesCryptoServiceProvider 加密数据

c# - 为什么我的 KeyPressEvent 不能与右/左/上/下一起使用?

c# - 在 C# 中通过索引关系获取枚举

java - 使用 LookAndFeel 进行 JFrame 序列化