我在下面有一个非常简单的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/