2013-03-04 32 views
6

Tôi đang triển khai mẫu nhà máy cho 3 lớp mã hóa khác nhau. Nhà máy sẽ quyết định cái nào cần tạo và sau đó lấy một thể hiện tuần tự của lớp chính xác từ một cơ sở dữ liệu và trả về cho người yêu cầu. Ngay bây giờ tôi đang làm việc trên serializing các lớp học để lưu trữ chúng trong cơ sở dữ liệu. Tôi đang viết một cho lớp mã hóa PGP có tên là BouncyCastle. Tôi có thể tạo lớp và các khóa từ các tệp nhưng khi tôi cố gắng tuần tự hóa nó, nó nói rằng hai biến thành viên, là đối tượng của lớp PgpPublicKeyPgpPrivateKey, không thể được tuần tự hóa vì chúng không có các hàm tạo tham số.C# tuần tự hóa một lớp không có một hàm tạo tham số

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(); 
} 

Lớp học có hai biến thành viên là vấn đề.

public class BouncyCastle : ICryptographyProvider 
{ 

    public PgpPublicKey m_publicKey; 
    public PgpPrivateKey m_privateKey; 
    public string m_passPhrase; 
    // cut out the irelevant parts 

Đây là lớp khóa công khai. Không có hàm tạo tham số.

public class PgpPublicKey 
{ 
    public PgpPublicKey(PublicKeyAlgorithmTag algorithm, AsymmetricKeyParameter pubKey, DateTime time); 
    // cut other methods 
} 
+1

Tạo lớp dữ liệu của riêng bạn để tuần tự hóa, sao chép các giá trị xung quanh khi cần thiết –

+1

Tại sao bạn không muốn chỉ thêm các hàm tạo tham số? – Restuta

Trả lời

25

Bất kỳ lớp Serializer nào cần một trình tạo không tham số vì nó sao chép mọi thuộc tính công khai lấy từ dữ liệu bị thu hồi.

Bạn có thể dễ dàng làm cho hàm tạo riêng tư, nếu bạn muốn tránh tạo nó mà không có tham số.

EX:

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

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

tôi đã cố gắng xây dựng parameterless private và nó không hoạt động theo cách đó cho tôi. tôi cần phải công khai nó để deserialize đúng cách –

3

Vâng, XmlSerializer đòi hỏi constructor một parameterless để tồn tại trong trật tự cho serialization để làm việc.

Từ câu trả lời sau đây: Why XML-Serializable class need a parameterless constructor

Trong de-serialization của một đối tượng, lớp chịu trách nhiệm về de-serializing một đối tượng tạo ra một thể hiện của lớp serialized và sau đó tiến hành đặt các trường serialized và tài sản chỉ sau khi có được một cá thể để cư trú.

Bạn có thể đặt hàm tạo riêng của mình hoặc nội bộ nếu muốn, chỉ cần miễn là không có tham số của nó.

0

Các lớp học PgpPublicKeyPgpPrivateKey do bạn xác định? Đơn giản chỉ cần thêm constructor parameterless cho họ.

Chúng có thể là riêng tư nếu bạn không muốn làm cho chúng có thể truy cập từ bên ngoài. Trình khử dung dịch vẫn có thể truy cập chúng.

1

DataContractSerializer không yêu cầu hàm tạo tham số. Những gì nó thay vào đó yêu cầu là các thuộc tính đặc biệt của lớp.

Các vấn đề liên quan