【发布时间】:2018-09-26 15:29:43
【问题描述】:
我正在序列化一个错误地创建其属性之一的节点的类。我的班级结构如下:
这是我正在序列化的顶级类
[DataContract]
public class XmlReportConfiguration
{
[DataMember]
[XmlArrayItem(nameof(SingleValueDescription), typeof(SingleValueDescription))]
[XmlArrayItem(nameof(MultiValueDescription), typeof(MultiValueDescription))]
public List<Description> Descriptions { get; set; }
}
MultiValueDescription 继承自 SingleValueDescription,而 SingleValueDescription 继承自 Description。
Description 具有用于单值和多值描述的 XMlInclude 标记
我的问题是当我去序列化类型为 MultiValueDescription 的描述时,xml 节点将其序列化为 SingleValueDescription。
如果我从 XmlReportConfiguration 类中删除 SingleValueDescription 的 XmlArrayItem 条目,它会按我的意愿工作,但由于显而易见的原因,我无法删除该声明。
是否有一些我在这里遗漏的标记/声明导致序列化程序忽略节点的子类并使用父类?
创建序列化器时的方法如下:
public static string SerializeReportConfiguration(XmlReportConfiguration config)
{
XmlSerializer serializer = new XmlSerializer(typeof(XmlReportConfiguration));
StringBuilder sb = new StringBuilder();
using (TextWriter writer = new StringWriter(sb))
{
serializer.Serialize(writer, config);
}
return sb.ToString();
}
public static XmlReportConfiguration DeserializeReportConfiguration(string xml)
{
XmlSerializer serializer = new XmlSerializer(typeof(XmlReportConfiguration));
using (StringReader reader = new StringReader(xml))
{
XmlReportConfiguration sessionConfig = serializer.Deserialize(reader) as XmlReportConfiguration;
return sessionConfig;
}
}
【问题讨论】:
-
你能分享一个minimal reproducible example吗?甚至不清楚您使用的是
DataContractSerializer还是XmlSerializer。 -
我正在使用 XmlSerializer 传入 typeof(XmlReportConfiguration)。我添加了我的序列化方法。
-
无法复制,请参阅dotnetfiddle.net/EGivyS。由于缺少许多类型,您的代码无法编译。此外,未显示反序列化代码。所以我不得不做出一些猜测。
-
添加了反序列化部分,但它非常通用,所以我不知道它在这里有什么帮助。
-
找到了我的问题的解决方案。贴出我用过的东西。
标签: c# serialization xml-serialization