我在下面有一个非常简单的XML文件:

<Job Name="test">
    <Pages>
        <MainPage Name="page1"/>
    </Pages>
</Job>


“ MainPage”是PageBase的派生类,其类结构如下

public class Job
{
    [XmlAttribute]
    public string Name { get; set; }

    [XmlElement]
    public List<PageBase> Pages { get; set; }
}

[XmlInclude(typeof(MainPage))]
[XmlInclude(typeof(SubPage))]
public abstract class PageBase
{
    [XmlAttribute]
    public string Name { get; set; }
}

public class MainPage : PageBase
{

}

public class SubPage : PageBase
{

}


这是我用来反序列化的示例代码:

var xml = "<Job Name=\"test\"><Pages><MainPage Name=\"page1\"></MainPage></Pages></Job>";
MemoryStream str = new MemoryStream();
StreamWriter writer = new StreamWriter(str);
writer.Write(xml);
writer.Flush();
str.Position = 0;

var serializer = new XmlSerializer(typeof(Job));
var job = (Job)serializer.Deserialize(str);


但是,我收到以下错误-尽管在PageBase类型上包括了XmlInclude。我究竟做错了什么? DotNetFiddle此处:https://dotnetfiddle.net/UucVmX


运行时异常(第18行):XML文档中存在错误(1,
19)。

堆栈跟踪:

[System.InvalidOperationException:指定的类型是抽象的:
name ='PageBase',namespace =“,位于。]
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderJob.Read4_PageBase(布尔
isNullable,布尔值CheckType),位于
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderJob.Read5_Job(布尔
isNullable,布尔值CheckType),位于
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderJob.Read6_Job()

[System.InvalidOperationException:XML文档中存在错误
(1,19)。]在
System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader
xmlReader,字符串encodingStyle,XmlDeserializationEvents事件)
在System.Xml.Serialization.XmlSerializer.Deserialize(Stream stream)处
在Program.Main():第18行

最佳答案

将您的XML更改为:

<Job Name="test">
    <Pages>
        <PageBase xsi:type="MainPage" Name="page1"/>
    </Pages>
</Job>


首先尝试序列化您的对象,然后检查它产生的XML。您应该看到XML元素将是PageBase和xsi:type =“ MainPage”。

关于c# - 使用派生类从C#中的XML反序列化对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60448217/

10-10 14:25