gpt4 book ai didi

c# - 使用派生类从 C# 中的 XML 反序列化对象

转载 作者:行者123 更新时间:2023-12-03 18:00:02 27 4
gpt4 key购买 nike

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

Run-time exception (line 18): There is an error in XML document (1, 19).

Stack Trace:

[System.InvalidOperationException: The specified type is abstract: name='PageBase', namespace='', at .] at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderJob.Read4_PageBase(Boolean isNullable, Boolean checkType) at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderJob.Read5_Job(Boolean isNullable, Boolean checkType) at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderJob.Read6_Job()

[System.InvalidOperationException: There is an error in XML document (1, 19).] at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(Stream stream)
at Program.Main() :line 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com