2016-09-14 3 views
1

У меня есть следующий класс:Не может десериализации из derrived класса

public class Label 
{ 
    public string Name { get; set; } 

    public List<Field> Fields { get; set; } 

    public Label(){} 
} 

List<Field> может содержать derrived классов от Field, например:

public class Image : Field 
{ 
    public string Path { get; set; } 
    public int MyProperty { get; set; } 
} 

public class Field 
{ 
    int Xpos { get; set; } 
    int Ypos { get; set; } 
} 

Однако, когда я использую следующий XML :

<?xml version="1.0" encoding="utf-8"?> 
    <Label> 
    <Name>test</Name> 

    <Fields> 
     <Image></Image> 
    </Fields> 
</Label> 

Мой десериализации код:

string xmlString = File.ReadAllText(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "Label_1.xml"); 
var serializer = new XmlSerializer(typeof(Label), new XmlRootAttribute("Label")); 
Label result; 

using (TextReader reader = new StringReader(xmlString)) 
{ 
    result = (Label)serializer.Deserialize(reader); 
} 

И я десериализация его, Field свойства из Label имеет только Field в нем, а не Image. Как я могу получить классный образ Derrive, который будет добавлен в список полей? Теперь я могу добавлять классы Field, и изображения игнорируются. Спасибо за помощь!

EDIT

Если я изменить свой код на следующее:

[XmlInclude(typeof(Image))] 
public abstract class Field 
{ 
    int Xpos { get; set; } 
    int Ypos { get; set; } 
    int Zindex { get; set; } 
    Style Style { get; set; } 
} 

Ничего не происходит! :(

+0

Возможный дубликат [C# XML сериализации производных классов] (http://stackoverflow.com/questions/3326481/c-sharp-xml-serialization-of-derived-classes) –

ответ

1

это должно сделать трюк

[XmlArrayItem(ElementName = "Field", Type = typeof(Field))] 
    [XmlArrayItem(ElementName = "Image", Type = typeof(Image))] 
    public List<Field> Fields { get; set; } 
+0

Awesome. Благодарю. Можете ли вы объяснить, почему? Я люблю учиться – Markinson

+0

Спасибо. Этот тег 'представляет собой атрибут, который указывает производные типы, которые XmlSerializer может размещать в сериализованном массиве', из [msdn] (https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlarrayitemattribute .aspx) ... где сериализованный массив является приведенным выше списком –

1

Сделать Fieldабстрактный, реализовать его на Image и использовать XmlIncludeAttribute

[XmlInclude(typeof(Image))] 
public abstract class Field 
{ 
    int Xpos; 
    int Ypos; 
} 
+0

Сделал это, но он не добавлен – Markinson

+0

Попробуйте сериализовать его fir st и посмотреть, что должен быть XML –

Смежные вопросы