gpt4 book ai didi

c# - 使用 XML 序列化序列化接口(interface)列表

转载 作者:太空宇宙 更新时间:2023-11-03 20:02:52 24 4
gpt4 key购买 nike

我有下面的类,我需要使用 XML 序列化程序对其进行序列化

我知道 XML 序列化程序不喜欢接口(interface)

但是,我们的编码标准通常总是针对接口(interface)而非具体类进行编码

我想到了一种方法可以在不更改类型的情况下流式传输此列表,这会导致许多编译问题以及违反我们的标准

我的想法是拥有一个读取 Meters 列表并转换为具体类的属性,然后在序列化时完全忽略 Meters

但是,XML 仍然需要将 Meters 作为元素名称

但是这不起作用

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Xml.Serialization;

public class MeterWalkOrder
{
public MeterWalkOrder()
{
Meters = new List<IMeter>();
}

public String Name { get; set; }


[XmlIgnore]
public List<IMeter> Meters { get; set; }

[XmlArrayItem(ElementName = "Meter")]
[XmlElement(ElementName = "Meters")]
public List<Meter> SerializableMeters
{
get
{
return Meters.Cast<Meter>().ToList();
}
set
{
Meters = new List<IMeter>(value);
}
}
}
}

有什么办法解决这个问题吗?

我的 XML(无法更改)如下

   <MeterWalkOrder>
<Name>Red Route</Name>
<Meters>
<Meter>
<MeterID>1</MeterID>
<SerialNumber>12345</SerialNumber>
</Meter>
<Meter>
<MeterID>2</MeterID>
<SerialNumber>SE</SerialNumber>
</Meter>
</Meters>
</MeterWalkOrder>

顶级错误是

反射(reflect)类型“WindowsFormsApplication1.Classes.MeterWalkOrder”时出现错误。

内部异常是

{“XmlElement、XmlText 和 XmlAnyElement 不能与 XmlAttribute、XmlAnyAttribute、XmlArray 或 XmlArrayItem 一起使用。”

我真的很想避免开创使用具体类列表的先例

最佳答案

您需要将 [XmlElement(ElementName = "Meters")] 替换为 [XmlArray(ElementName = "Meters")] 作为错误状态:

{"XmlElement, XmlText, and XmlAnyElement cannot be used in conjunction with XmlAttribute, XmlAnyAttribute, XmlArray, or XmlArrayItem."}

要为 XmlSerializer 定义一个数组,您可以用 XmlArray 标记它,并用 XmlArrayItem 标记它的对应项

例子:

public class MeterWalkOrder
{
public MeterWalkOrder()
{
Meters = new List<IMeter>();
}

public String Name { get; set; }

[XmlIgnore]
public List<IMeter> Meters { get; set; }

[XmlArrayItem(ElementName = "Meter")]
[XmlArray(ElementName = "Meters")]
public List<Meter> SerializableMeters
{
get
{
return Meters.Cast<Meter>().ToList();
}
set
{
Meters = new List<IMeter>(value);
}
}
}

public interface IMeter {
int MeterID { get; set; }
}

public class Meter : IMeter {
public int MeterID { get; set; }
public string SerialNumber { get; set; }
}

测试:

var data = new MeterWalkOrder{ Name = "Red Route", Meters = new List<IMeter>
{
new Meter{ MeterID = 1, SerialNumber = "12345"},
new Meter{ MeterID = 2, SerialNumber = "SE"}
}};
using (var stream = new FileStream("C:\\Users\\Adam\\Desktop\\Test2.xml", FileMode.OpenOrCreate))
{
XmlSerializer ser = new XmlSerializer(typeof(MeterWalkOrder));
ser.Serialize(stream, data);
}

结果:

<?xml version="1.0"?>
<MeterWalkOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Name>Red Route</Name>
<Meters>
<Meter>
<MeterID>1</MeterID>
<SerialNumber>12345</SerialNumber>
</Meter>
<Meter>
<MeterID>2</MeterID>
<SerialNumber>SE</SerialNumber>
</Meter>
</Meters>
</MeterWalkOrder>

关于c# - 使用 XML 序列化序列化接口(interface)列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26172148/

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