无法从被驱逐的阶级反序列化

时间:2016-09-14 09:24:03

标签: c# deserialization xml-deserialization

我有以下课程:

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

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

    public Label(){}
}

List<Field>可以包含来自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的{​​{1}}属性只包含Label,而不是Field。我怎样才能将得到的图像添加到字段列表中?现在我只能添加Field类,并且忽略了Images。谢谢你的帮助!

修改

如果我将代码更改为以下内容:

Image

什么都没发生! :(

2 个答案:

答案 0 :(得分:1)

制作Field 抽象,在Image上实施并使用XmlIncludeAttribute

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

答案 1 :(得分:1)

这应该可以解决问题

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