2012-04-04 24 views
12

thể trùng lặp:
How to serialize an IList<T>?Làm thế nào để serialize một giao diện như IList <T>

Tôi muốn serialize một lớp (chúng ta hãy gọi nó S) có chứa một tài sản của các loại IList<T> trong đó T là một lớp khác mà tôi đã xác định. Tôi nhận được một ngoại lệ khi tôi cố gắng để tuần tự hóa một thể hiện của lớp S thành XML. Điều này là dễ hiểu vì XmlSerializer không biết lớp bê tông nào cần sử dụng. Có cách nào, hy vọng sử dụng các thuộc tính, để xác định lớp bê tông nào để khởi tạo khi tuần tự hóa/deserializing một cá thể. Việc triển khai lớp S của tôi tạo ra một thể hiện của lớp List<T>. Dưới đây là một số mã để minh họa cho ví dụ của tôi:

using System; 
using System.Xml.Serialization; 
using System.IO; 

[Serializable] 
public class T { } 

[Serializable] 
public class S 
{ 
    public IList<T> ListOfTs { get; set; } 

    public S() 
    { 
     ListOfTs = new List<T>(); 
    } 
} 

public class Program 
{ 
    public void Main() 
    { 
     S s = new S(); 
     s.ListOfTs.Add(new T()); 
     s.ListOfTs.Add(new T()); 
     XmlSerializer serializer = new XmlSerializer(typeof(S)); 
     serializer.Serialize(new StringWriter(), s); 
    } 
} 

Tôi hy vọng có một thuộc tính tôi có thể đặt phía trên các định nghĩa ListOfTs nói rằng để serialize, "giả định một thể hiện của List<T> khi serializing/deserializing".

Trả lời

11

Thay đổi

public IList<T> ListOfTs { get; set; } 

để

public List<T> ListOfTs { get; set; } 

Sau đó, nó sẽ làm việc.

+3

Tôi sẽ làm điều này, ngoại trừ điều này sẽ thay đổi giao diện cho lớp 'S'. Mặc dù điều này dường như không có tác động thực tế, nhưng từ quan điểm về nguyên tắc, tôi muốn xem liệu có cách nào để giải quyết vấn đề mà không thay đổi loại. –

+0

Giải pháp được đề xuất, mặc dù là giải pháp hoạt động, có thể làm hỏng cấu trúc API công khai của bạn – bashis

0

Bạn có thể triển khai giao diện IXmlSerializable và triển khai logic tuần tự theo cách thủ công bằng trình đọc và nhà văn Xml.

2

Tôi nghĩ có 2 cách thường được tiếp cận cho loại vấn đề này.

Một người sẽ sử dụng DataContractSerializer, nhưng vì bạn đã sử dụng XmlSerializer, có thể bạn không muốn làm điều đó.

"Thay thế" là có thuộc tính được sử dụng riêng cho mục đích tuần tự hóa và bỏ qua IList trong quá trình tuần tự hóa.

[Serializable] 
public class S 
{ 
    IList<T> _listofTs; 

    [XmlIgnore] 
    public IList<T> ListOfTs { get _listofTs; set _listofTs = value; } 

    [XmlElement(Name="Not Exactly the Greatest Solution!")] 
    public List<T> ListOfTs { get _listofTs; set _listofTs = value; } 

    public S() 
    { 
     ListOfTs = new List<T>(); 
    } 
} 
+0

Sử dụng thuộc tính XmlIgnore trên thuộc tính sẽ hoàn toàn bỏ qua nó. Các câu hỏi là bao gồm thuộc tính giao diện trong tuần tự hóa. –

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