如果我有像这样的xml
<SiteSettings>
<sortOptions>
<add name="By Date" value="date" />
<add name="By Rating" value="rating" />
</sortOptions>
</SiteSettings>
我想将其反序列化为像这样的对象
[XmlRoot("SiteSettings")]
public class SerializableSiteSettings
{
public List<NameValuePair> SortOptions { get; set; }
}
public class NameValuePair
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("value")]
public object Value { get; set; }
}
我尝试将此添加到SortOptions但它无法正常工作
[XmlArrayItem("actionButtons", typeof(List<NameValuePair>))]
public List<NameValuePair> ActionButtons { get; set; }
答案 0 :(得分:2)
使用XmlSerializer
时存在一些问题:
XmlSerializer
needs to know the types to expect when (de)serializing.当你有一个像public object Value { get; set; }
这样的字段时,它不知道如何反序列化字段或其中的内容。你需要告诉它那些信息 - 但是因为Value
是一个attribute,它表明该字段很简单,就像一个字符串。所以,我将在这个答案中假设一个字符串足以保存这些信息。
您需要告诉XmlSerializer
使用{{3},使用名称SortOptions
而不是sortOptions
序列化名为SortOptions
的媒体资源} attribute。
您需要使用XmlArray
属性告诉XmlSerializer
add
是每个数组元素的名称。
因此,以下工作并将Value
读入字符串:
[XmlRoot("SiteSettings")]
public class SerializableSiteSettings
{
[XmlArray("sortOptions")]
[XmlArrayItem("add", typeof(NameValuePair))]
public List<NameValuePair> SortOptions { get; set; }
}
public class NameValuePair
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("value")]
public string Value { get; set; }
}
如果Value
不是字符串且实际上是某种多态类型,则可能需要为IXmlSerializable
实施NameValuePair
,如下所示:XmlArrayItem