【发布时间】:2014-10-03 13:23:43
【问题描述】:
这是我之前的问题Serialize list of interfaces using 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")]
[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; }
}
}
我正在使用下面的扩展方法将 XML 反序列化回我的对象(理想情况下,我希望扩展方法脱离对象,但我对扩展方法不太满意,所以我现在就这样离开了)。 ..
public static class SerializationExtensions
{
public static T LoadFromXML<T>(this string xmlString)
{
T returnValue = default(T);
XmlSerializer serial = new XmlSerializer(typeof(T));
StringReader reader = new StringReader(xmlString);
object result = serial.Deserialize(reader);
if (result != null && result is T)
{
returnValue = ((T)result);
}
reader.Close();
return returnValue;
}
....但是,当我在下面给出 XML 时....
<?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>
没有仪表被填充?
有谁知道什么会导致这个问题? XML 是有效的,SerializeableMeters 只是一个读取和写入 Meters 的属性,但由于在序列化中使用接口的已知问题,将其转换为具体类
【问题讨论】:
-
为什么需要 SerializableMeters?为什么不直接序列化 Meters 属性?
-
我不能直接序列化它,因为它是一个不受支持的接口列表。我不想将其更改为使用具体类,因为我们总是对接口而不是具体类进行编码
标签: c# deserialization xmlserializer