【发布时间】:2015-12-21 21:06:36
【问题描述】:
在我的一个对象中,我有一本通过实现IXmlSerializable 进行序列化的字典:
public SerializableStringDictionary Parameters { get; set; }
当我使用普通的 .NET 序列化程序序列化这些对象的列表时,它可以很好地序列化,但是反序列化只执行单个对象 - XML 文件中遵循可序列化字典的元素被跳过。
例如,我有一个<MaintenanceIndicators> 的列表。我在下面只显示一个,但这是代码中的List<MaintenanceIndicator>。具有多个条目的列表的序列化工作正常,但反序列化多个仅在列表中给我 1 MaintenanceIndicator。但是,它的参数属性可以反序列化。代码中不会抛出异常。
我使用以下代码进行反序列化:
public void ReadXml(XmlReader reader)
{
bool wasEmpty = reader.IsEmptyElement;
// jump to <parameters>
reader.Read();
if (wasEmpty)
return;
// read until we reach the last element
while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
{
// jump to <item>
reader.MoveToContent();
// jump to key attribute and read
reader.MoveToAttribute("key");
string key = reader.GetAttribute("key");
// jump to value attribute and read
reader.MoveToAttribute("value");
string value = reader.GetAttribute("value");
// add item to the dictionary
this.Add(key, value);
// jump to next <item>
reader.ReadStartElement("item");
reader.MoveToContent(); // workaround to trigger node type
}
}
我在 XML 中的结构如下所示:
<MaintenanceIndicators>
<MaintenanceIndicator Id="1" Name="Test" Description="Test" Type="LimitMonitor" ExecutionOrder="1">
<Parameters>
<item key="Input" value="a" />
<item key="Output" value="b" />
<item key="Direction" value="GreaterThan" />
<item key="LimitValue" value="1" />
<item key="Hysteresis" value="1" />
</Parameters>
</MaintenanceIndicator>
<!-- Any subsequent MaintenanceIndicator indicator element will not be read -->
</MaintenanceIndicators>
【问题讨论】:
-
你有没有在 SO 上尝试过其他一些字典反序列化方法? stackoverflow.com/questions/12554186/…
-
您的 XML 格式是否正确?它没有 MaintenanceIndicators 集合元素的结束标记。
-
我已经更新了xml,在源中是正确的,我只是粘贴错了。
-
@thinklarge 我从该示例开始,并将其用于更复杂的字典,但是我只是将其重写为使用属性而不是元素。在应用程序的另一部分,我将其序列化为类似于实体框架中的字符串,使用属性比使用元素小得多。
标签: c# xml serialization ixmlserializable