【发布时间】:2020-08-31 18:12:04
【问题描述】:
我正在使用需要遵守的外部开发 XSD,其中字段 Engine 可以是以下两种类型之一:Electric 或 Combustion。两者都派生自超类Engine。
有多种方法可以让 C# 中的 XmlSerializer 处理此问题,但似乎都与相同的副作用相关:使用自定义序列化程序时,默认的序列化命名约定被抛弃了。我想模仿 Vehicle 类的其余字段的默认行为。
考虑以下几点:
using System;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
namespace DMV
{
public class Vehicle : IXmlSerializable
{
public Engine Engine { get; set; }
[XmlElement("Manufacturer")]
public Company Manufacturer { get; set; }
public void WriteXml(XmlWriter writer)
{
XmlSerializer engineSerializer = new XmlSerializer(Engine.GetType());
engineSerializer.Serialize(writer, Engine);
XmlSerializer manufacturerSerializer = new XmlSerializer(Manufacturer.GetType());
manufacturerSerializer.Serialize(writer, Manufacturer);
}
}
public abstract class Engine { }
public class Electric : Engine
{
public int Poles { get; set; }
}
public class Combustion : Engine
{
public int CC { get; set; }
}
public class Company
{
public string Name { get; set; }
}
}
我尝试使用以下序列化代码运行它:
Vehicle vehicle = new Vehicle();
vehicle.Engine = new Electric();
vehicle.Manufacturer = new Company();
XmlSerializer serializer = new XmlSerializer(typeof(Vehicle));
TextWriter writer = new StringWriter();
serializer.Serialize(writer, vehicle);
Console.WriteLine(writer.ToString());
writer.Close();
结果是下面一堆令人失望的 caballus 粪便:
<Vehicle>
<Electric>
<Poles>0</Poles>
</Electric>
<Company/>
</Vehicle>
(是的,Engine 字段已正确序列化,但Company 没有那么多。)
如果我使用默认(内置)序列化,我会得到以下(期望的!)输出:
<Vehicle>
<Manufacturer />
</Vehicle>
如何既序列化派生类Electric 或Combustion,同时保留字段Manufacturer(Company 类型)的默认命名约定?
【问题讨论】:
标签: c# xml .net-core serialization