gpt4 book ai didi

c# - 在 C# 中使用自定义序列化时如何控制 XML 元素的名称?

转载 作者:行者123 更新时间:2023-12-04 02:32:04 25 4
gpt4 key购买 nike

我正在使用我需要符合的外部开发的 XSD,其中字段 Engine 可以是以下两种类型之一:ElectricCombustion 。两者都派生自父类(super class) 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>

如何同时序列化派生类 ElectricCombustion,同时保留字段 Manufacturer( 类型)的默认命名约定>公司)?

最佳答案

您可以通过这样做来摆脱自定义序列化程序:

public class Vehicle
{
[XmlElement(typeof(Electric), ElementName = "Electric")]
[XmlElement(typeof(Combustion), ElementName = "Combustion")]
public Engine Engine { get; set; }
[XmlElement("Manufacturer")]
public Company Manufacturer { get; set; }
}

关于c# - 在 C# 中使用自定义序列化时如何控制 XML 元素的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63676039/

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