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
Trả lời
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.
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>
nếu bạn không muốn giữ nguyên tố Animals bạn có thể sử dụng XmlArrayItemAttribute thay thế. – Console
- 1. Các lớp cơ sở trừu tượng lớn
- 2. Lớp hoặc Lớp cơ sở trừu tượng?
- 3. Lớp cơ sở trừu tượng cho tất cả các đối tượng thực thể miền
- 4. Dịch vụ web ASMX không tuần tự hóa lớp cơ sở trừu tượng
- 5. Các loại chung so với lớp trừu tượng/Giao diện
- 6. Scala: Trait Mixin với Lớp cơ sở trừu tượng
- 7. Đối tượng ánh xạ có chứa ptr_map của lớp cơ sở trừu tượng
- 8. mô hình lớp cơ sở trừu tượng và các lớp con trong cơ sở dữ liệu
- 9. phương pháp chung trong lớp trừu tượng
- 10. Python(), các lớp cơ sở trừu tượng, và NotImplementedError
- 11. List.Contains (mục) với danh sách chung của các đối tượng
- 12. Lớp cơ sở hoặc trợ giúp trừu tượng
- 13. tuần tự hóa các đối tượng python thành XML
- 14. Django: Truy vấn một lớp cơ sở trừu tượng
- 15. Nếu đối tượng là Danh sách chung
- 16. lớp trừu tượng cho cơ sở dữ liệu Node.js
- 17. Trả về kiểu trừu tượng trong lớp cơ sở
- 18. 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?
- 19. Chức năng trừu tượng và danh sách đối số biến
- 20. Python - Thử nghiệm một lớp cơ sở trừu tượng
- 21. Không thể truyền kiểu dẫn xuất đến lớp trừu tượng cơ sở với tham số kiểu
- 22. desctructor ảo trên tinh khiết trừu tượng lớp cơ sở
- 23. Lưu trữ Danh sách các đối tượng
- 24. Sử dụng XmlSerializer để tuần tự các lớp thừa kế
- 25. ForeignKey đến lớp trừu tượng (quan hệ chung)
- 26. Ràng buộc Guice cho Danh sách các đối tượng chung
- 27. python - danh sách các đối tượng có thể đọc được
- 28. Đối tượng tuần tự với đầu ra
- 29. Có thể Serialize một đối tượng LINQ không?
- 30. Xác định các loại có nguồn gốc từ một danh sách các đối tượng lớp cơ sở
Đồ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