2013-03-04 173 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不需要無參數構造函數。它所需要的是類的特殊屬性。

相關問題