2012-02-12 37 views
6

Bất kỳ mẫu tốt nào về cách sắp xếp danh sách các đối tượng chung với lớp cơ sở trừu tượng. Các mẫu có lớp cơ sở không trừu tượng được liệt kê trong XML Serialize generic list of serializable objects. Lớp cơ sở của tôi tương tự như Microsoft.Build.Utilities.TaskXML Serialize danh sách chung các đối tượng có thể tuần tự với lớp cơ sở trừu tượng

+0

Đồng ý với @Dmitry. Câu trả lời thay thế có thể được tìm thấy trong Serializing mà không cần XmlInclude http://stackoverflow.com/questions/370291/serializing-without-xmlinclude – walter

Trả lời

4

Thường hữu ích khi có lớp trừu tượng với một số loại có nguồn gốc để cho phép sử dụng danh sách được nhập mạnh mẽ và danh sách như vậy.

Ví dụ bạn có thể có lớp DocumentFragment trừu tượng và hai lớp cụ thể được gọi là TextDocumentFragment và CommentDocumentFragment (ví dụ này từ Willis).

Điều này cho phép tạo thuộc tính Danh sách chỉ có thể chứa các đối tượng của hai loại đó.

Nếu bạn cố gắng để tạo ra một WebService trả về danh sách này, bạn nhận được một lỗi nhưng điều này rất dễ dàng để có được xung quanh với mã dưới đây ....

[Serializable()] 
[System.Xml.Serialization.XmlInclude(typeof(TextDocumentFragment))] 
[System.Xml.Serialization.XmlInclude(typeof(CommentDocumentFragment))] 
public abstract class DocumentFragment { 
...} 

Các thuộc tính XmlInclude nói với lớp rằng nó có thể được tuần tự hóa thành hai lớp dẫn xuất.

Điều này tạo ra một thuộc tính trong phần tử DocumentFragment xác định loại thực tế, như dưới đây.

<DocumentFragment xsi:type="TextDocumentFragment"> 

Bất kỳ thuộc tính bổ trợ cụ thể nào cho lớp dẫn xuất cũng sẽ được bao gồm bằng phương pháp này.

11

Một lựa chọn khác là sử dụng XmlElementAttribute để di chuyển danh sách các loại được biết đến với danh sách chung thân ...

using System; 
using System.Xml; 
using System.Xml.Serialization; 
using System.Collections.Generic; 

public abstract class Animal 
{ 
    public int Weight { get; set; }  
} 

public class Cat : Animal 
{ 
    public int FurLength { get; set; }  
} 

public class Fish : Animal 
{ 
    public int ScalesCount { get; set; }  
} 

public class AnimalFarm 
{ 
    [XmlElement(typeof(Cat))] 
    [XmlElement(typeof(Fish))] 
    public List<Animal> Animals { get; set; } 

    public AnimalFarm() 
    { 
     Animals = new List<Animal>(); 
    } 
} 

public class Program 
{ 
    public static void Main() 
    { 
     AnimalFarm animalFarm = new AnimalFarm(); 
     animalFarm.Animals.Add(new Cat() { Weight = 4000, FurLength = 3 }); 
     animalFarm.Animals.Add(new Fish() { Weight = 200, ScalesCount = 99 }); 
     XmlSerializer serializer = new XmlSerializer(typeof(AnimalFarm)); 
     serializer.Serialize(Console.Out, animalFarm); 
    } 
} 

... cũng sẽ dẫn đến một đầu ra XML nhìn tốt hơn (mà không có sự xấu xí xsi:type thuộc tính) ...

<?xml version="1.0" encoding="ibm850"?> 
<AnimalFarm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Cat> 
    <Weight>4000</Weight> 
    <FurLength>3</FurLength> 
    </Cat> 
    <Fish> 
    <Weight>200</Weight> 
    <ScalesCount>99</ScalesCount> 
    </Fish> 
</AnimalFarm> 
+0

nếu bạn không muốn giữ nguyên tố Animals bạn có thể sử dụng XmlArrayItemAttribute thay thế. – Console

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