2011-08-02 32 views
7

Tôi gặp sự cố khi tuần tự hóa từ điển chứa danh sách các đối tượng có nguồn gốc. Sản lượng được tuần tự hóa chứaViệc tuần tự hóa các đối tượng có nguồn gốc mà không có xsi: loại

<BaseAttributes xsi:type="Turbine" Id="1975fe1f-7aa8-4f1d-b768-93ad262800cd"> 

nơi tôi muốn BaseAttributes được thay thế bằng Turbine và xsi: loại không tồn tại.

<Turbine Id="1975fe1f-7aa8-4f1d-b768-93ad262800cd"> 

Mã của tôi trông giống như sau. Tôi có một lớp BaseAttributes từ đó tôi lấy được một số lớp, ví dụ như lớp Turbine. Các lớp này được lưu trữ trong một từ điển với Danh sách các BaseAttributes. Từ điển là một từ điển serializable được thực hiện. Dưới đây là mã nói chung.

[XmlInclude(typeof(Turbine)), XmlInclude(typeof(Station)), XmlInclude(typeof(Substation))] 
public class BaseAttributes { 

    [XmlAttribute("Id")] 
    public Guid Id; 
} 



public class Turbine : BaseAttributes { 
    private Element windSpeed; 
    public Element WindSpeed { 
    get { return windSpeed; } 
    set { windSpeed = value; } 
    } 

    public Turbine(float windSpeed){ 
    this.windSpeed= new Element(windSpeed.ToString(),"ms"); 
    } 
    //used for xmlserilization 
    private Turbine(){} 
} 



public class CollectionOfBaseAttributes { 
    public SerilizableUnitsDictionary<DateTime, List<BaseAttributes>> units; 
} 

[XmlRoot("dictionary")] 
public class SerilizableUnitsDictionary<TKey, TValue> 
: Dictionary<TKey, TValue>, IXmlSerializable { 

    public System.Xml.Schema.XmlSchema GetSchema() { 
    return null; 
    } 

    public void WriteXml(System.Xml.XmlWriter writer) { 

    XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue), new XmlRootAttribute("Units")); 

    foreach (TKey key in this.Keys) { 
    writer.WriteStartElement("TimeStamp");    
    writer.WriteAttributeString("Value", key.ToString()); 

    TValue value = this[key]; 
    foreach (TValue value1 in Values) {    
     valueSerializer.Serialize(writer, value1);  
    } 

    writer.WriteEndElement(); 
    } 
} 

Tôi không sử dụng DataContractor cho tuần tự hóa, vì tôi sẽ không deserializing XML. Tôi "chỉ" muốn tạo tệp XML với các thuộc tính.

Tôi đã cố gắng sử dụng XmlElementOverrides, nhưng có lẽ có điều gì đó mà tôi không hiểu trong quá trình sử dụng. Hiện tại tôi đã cố gắng sử dụng nó như thế này:

XmlAttributes attrs = new XmlAttributes(); 
XmlElementAttribute attr = new XmlElementAttribute(); 
attr.ElementName = "Turbine"; 
attr.Type = typeof(Turbine); 
attrs.XmlElements.Add(attr); 
XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides(); 
attrOverrides.Add(typeof(CollectionOfBaseAttributes), "BaseAttributes", attrs); 

XmlSerializer xmlSerializer = new XmlSerializer(typeof(CollectionOfBaseAttributes),attrOverrides); 

Nhưng không có kết quả từ đó.

Trả lời

12

Rơi vào nó một lần nữa hôm nay và bị phân tán SO không có câu trả lời.

Nếu đó là một danh sách các đối tượng trong một lĩnh vực hoặc một tài sản thêm này trên:

[XmlArrayItem(Type = typeof(Turbine))] 
[XmlArrayItem(Type = typeof(Station))] 

...

Nếu đó là một add đối tượng duy nhất:

[XmlElement(Type = typeof(Turbine))] 
[XmlElement(Type = typeof(Station))] 
+0

Cảm ơn người đàn ông , Nó đã giúp tôi rất nhiều. Câu trả lời này nên được chấp nhận như một giải pháp. –

+0

Điều này không cho phép sử dụng cùng một tên phần tử XML cho cả hai loại dẫn xuất. Có một giải pháp: http://stackoverflow.com/a/1730412/3088208 – pvgoran

-1

Tôi đã giải quyết gần như cùng một vấn đề, nhưng có ít hoặc không có sự khác biệt với mã bạn đã đăng.

Bạn đã cố gắng đặt các thuộc tính dưới dạng các khía cạnh, do đó, trên đầu trang của thuộc tính phần tử có nguồn gốc? Tôi làm theo cách đó. Hơn nữa tôi cũng đã thêm thuộc tính [Serializable] vào tất cả các lớp của tôi.

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