将派生类根序列化为类型为的基类名称
本文关键字:基类 类型 序列化 派生 | 更新日期: 2023-09-27 18:20:48
不知何故,我无法实现这种序列化。我有这些类
public class Data
{
[XmlElement("Name")]
public string Name { get; set; }
}
[XmlRoot("Data")]
public class DataA : Data
{
[XmlElement("ADesc")]
public string ADesc { get; set; }
}
[XmlRoot("Data")]
public class DataB : Data
{
[XmlElement("BDesc")]
public string BDesc { get; set; }
}
当我序列化DataA或DataB时,我应该得到以下结构中的XML:
<Data xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="" i:type="DataA">
<Name>A1</Name>
<ADesc>Description for A</ADesc>
</Data>
<Data xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="" i:type="DataB">
<Name>B1</Name>
<BDesc>Description for b</BDesc>
</Data>
我得到的是以下(没有I:type="…"和xmlns=")
<Data xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Name>A1</Name>
<ADesc>Description for A</ADesc>
</Data>
<Data xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Name>B1</Name>
<BDesc>Description for b</BDesc>
</Data>
我不确定我在这里错过了什么。任何建议都会有帮助。
- Girija
您应该包括基类的XML序列化的派生类型。
然后你可以为基类型创建一个序列化程序,当你序列化任何派生类型时,它会添加type属性:(你现在甚至可以从派生类中删除[Root]属性)
[XmlInclude(typeof(DataA))]
[XmlInclude(typeof(DataB))]
[XmlRoot("Data", Namespace = Data.XmlDefaultNameSpace)]
public class Data
{
public const string XmlDefaultNameSpace = "http://www.stackoverflow.com/xsd/Data";
[XmlElement("Name")]
public string Name { get; set; }
}
序列化:
DataA a = new DataA() { ADesc = "ADesc", Name = "A" };
DataB b = new DataB() { BDesc = "BDesc", Name = "B" };
new XmlSerializer(typeof(Data)).Serialize(Console.OpenStandardOutput(), a);
new XmlSerializer(typeof(Data)).Serialize(Console.OpenStandardOutput(), b);
以下是DataA类序列化的输出
<?xml version="1.0"?>
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="DataA" xmlns="http://www.stackoverflow.com/xsd/Data">
<Name>A</Name>
<ADesc xmlns="">ADesc</ADesc>