2012-01-13 35 views
10

Sửa Mã này nên minh họa toàn bộ vấn đề:Tại sao XmlSerializer có thể tuần tự hóa các lớp trừu tượng chứ không phải giao diện?

[XmlInclude(typeof(AThing1))] 
public abstract class AThing 
{ 
    public abstract string Name { get; set; } 
} 

[XmlInclude(typeof(IThing1))] 
public interface IThing 
{ 
    string Name { get; set; } 
} 

public class AThing1 : AThing 
{ 
    public override string Name { get; set; } 
} 

public class IThing1 : IThing 
{ 
    public string Name { get; set; } 
} 

List<AThing> aThings = new List<AThing>(new AThing[] { new AThing1() { Name = "Bob" } }); 
List<IThing> iThings = new List<IThing>(new IThing[] { new IThing1() { Name = "Bob" } }); 

public void Test() 
{ 
    using (StringWriter sw = new StringWriter()) 
    { 
     XmlSerializer aSerializer = new XmlSerializer(typeof(List<AThing>)); 
     aSerializer.Serialize(sw, aThings); 
     string text = sw.ToString(); 
    } 

    using (StringWriter sw = new StringWriter()) 
    { 
     // This line will throw "Cannot serialize interface IThing.": 
     XmlSerializer iSerializer = new XmlSerializer(typeof(List<IThing>));  
     iSerializer.Serialize(sw, iThings); 
     string text = sw.ToString(); 
    } 
} 

Đầu tiên text tạo ra bởi aSerializer sẽ là:

<?xml version="1.0" encoding="utf-16"?> 
<ArrayOfAThing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <AThing xsi:type="AThing1"> 
    <Name>Bob</Name> 
    </AThing> 
</ArrayOfAThing> 

Tôi không thấy lý do tại sao không thể iSerializer làm điều này:

<?xml version="1.0" encoding="utf-16"?> 
<ArrayOfIThing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <IThing xsi:type="IThing1"> 
    <Name>Bob</Name> 
    </IThing> 
</ArrayOfIThing> 

thay vì ném ngoại lệ.

+0

Bạn đã cố gắng biên dịch mã của mình chưa? Tôi không nghĩ rằng đoạn mã trên sẽ biên dịch. Ngoài ra, xin vui lòng gửi mã bạn sử dụng để serialize. Nó sẽ làm cho nó dễ dàng hơn nhiều để minh họa cho vấn đề là gì. –

+0

@JohnSaunders: Xem cập nhật của tôi Tôi nghĩ rằng nó nên được khá rõ ràng bây giờ. – Juan

+0

Đối với hồ sơ, ngoại lệ hoàn chỉnh bạn nhận được là gì? –

Trả lời

5

bạn có thể serialize giao diện, nhưng không đơn giản như các lớp:

http://ventspace.wordpress.com/2010/02/20/how-to-serialize-interfaces-in-net/

nhưng để trả lời câu hỏi của bạn tôi có 2 dự đoán về điều này:

Lý do đầu tiên là từ phía thực tiễn; Ngữ nghĩa của việc tuần tự hóa giao diện hơi bị mờ. Bạn nghĩ gì về serializer nên serialize khi bạn vượt qua trong một tham chiếu giao diện? Nếu bạn chỉ tuần tự hóa các thuộc tính giao diện, thì bạn có thể kết hợp với đối tượng không được khởi tạo một nửa. Không thể nói điều đó sẽ làm gì với đơn đăng ký của bạn.

Nếu bạn tuần tự hóa đối tượng đầy đủ cùng với thông tin loại thì làm tuần tự hóa giao diện thực sự không mua cho bạn bất cứ thứ gì. Bạn có thể nhập tham chiếu dưới dạng loại lớp ở nơi đầu tiên nếu ứng dụng của bạn thực sự quan tâm đối tượng là gì.

Mục thứ hai đi cùng với mục đích đã nêu của XmlSerializer. Mặc dù tên gây nhầm lẫn XML serialization trong .NET Framework thực sự là một công nghệ liên kết dữ liệu với mục đích chính để ánh xạ các kiểu dữ liệu MXL được định nghĩa trong các lược đồ XSD thành các kiểu .NET. Định nghĩa XSD biết về các lớp cơ sở trừu tượng , nhưng vì nó là trung tâm dữ liệu, không biết gì về giao diện . Với ý nghĩ đó, có rất ít động lực để hỗ trợ các giao diện trong XmlSerializer.

2

XmlSerializer không tuần tự hóa các lớp trừu tượng. Nó đang tuần tự hóa một trong một số lớp học bê tông.

+2

Vâng, tại sao nó không thể làm tương tự với giao diện? – Juan

+0

Các lớp cụ thể mà tôi tham chiếu là những thứ bạn tham chiếu trong 'XmlInclude' –

+8

Tôi hiểu bạn đang nói gì nhưng không hiểu điểm của bạn là gì.Tại sao không thể 'xmlSerializer' tuần tự hóa các lớp cụ thể thực hiện một giao diện giống như nó có thể tuần tự hóa các lớp cụ thể thực hiện một lớp trừu tượng, nơi đối tượng được tuần tự hóa trong danh sách được khai báo giống như các ví dụ mà tôi đưa ra trong câu hỏi của mình? – Juan

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