XmlSerializer 不使用 class 上定义的 XmlRoot
XmlSerializer not using XmlRoot defined on class
我正在尝试将自定义 class 序列化为 XML。这是 class:
[Serializable()]
[XmlRoot("KVP")]
public class SerializableKeyValuePair<TKey, TValue>
{
public SerializableKeyValuePair()
{ }
public SerializableKeyValuePair(TKey key, TValue value)
{
Key = key;
Value = value;
}
public TKey Key { get; set; }
public TValue Value { get; set; }
}
这是尝试序列化它的代码:
var xmlWriter = new StringWriter();
Type[] extraTypes = new Type[1] { typeof(SerializableKeyValuePair<string, string>) };
var xmlSerializer = new XmlSerializer(typeof(List<SerializableKeyValuePair<string, string>>), extraTypes);
xmlSerializer.Serialize(xmlWriter, functions);
xmlRet = xmlWriter.ToString();
这是实际结果:
<ArrayOfSerializableKeyValuePairOfStringString>
<SerializableKeyValuePairOfStringString>
<Key>Min</Key>
<Value>Min</Value>
</SerializableKeyValuePairOfStringString>
<SerializableKeyValuePairOfStringString>
<Key>MinAvgMax</Key>
<Value>MinAvgMax</Value>
</SerializableKeyValuePairOfStringString>
</ArrayOfSerializableKeyValuePairOfStringString>
我想看的是下面的,但是好像没有使用我定义的XmlRoot。谁能帮我弄清楚如何获得这个 XML 结构?
<ArrayOfKVP>
<KVP>
<Key>Min</Key>
<Value>Min</Value>
</KVP>
<KVP>
<Key>MinAvgMax</Key>
<Value>MinAvgMax</Value>
</KVP>
</ArrayOfKVP>
TIA!
但是 SerializableKeyValuePair
不是根,List<SerializableKeyValuePair<string, string>>
是!
我想你在找 XmlType
:
[XmlType("KVP")]
public class SerializableKeyValuePair<TKey, TValue>
{
//...
}
如果您想更改列表的元素名称,可以在创建序列化程序时提供 XmlRootAttribute
:
var serializer = new XmlSerializer(typeof(List<SerializableKeyValuePair<string, string>>),
null, extraTypes, new XmlRootAttribute("ArrayOfKVP"), string.Empty);
顺便说一句,Serializable
与XmlSerializer
无关。除非您出于其他目的需要它,否则可以将其删除。
首先可以尝试select序列化之前的KVP数组
var xKVP = xDoc.Root.Descendants().FirstOrDefault(d => d.Name.LocalName.Equals("car"));
var serializer = new XmlSerializer(typeof(SerializableKeyValuePair<string, string>));
using (var reader = xKVP.CreateReader())
{
var result = (SerializableKeyValuePair<string, string>) serializer.Deserialize(reader);
Console.WriteLine(result.Key);
Console.WriteLine(result.Value);
}
另一种方式,您可以为您的 KVP 数组创建一个包装器
[XmlRoot("ArrayOfKVP")]
class ArrayOfKVP
{
public ArrayOfKVP() {}
[XmlElement("KVP")]
public List<Foo> KVPList {get; set;}
}
[Serializable()]
[XmlType("KVP")]
public class SerializableKeyValuePair<TKey, TValue>
{
public SerializableKeyValuePair()
{ }
public SerializableKeyValuePair(TKey key, TValue value)
{
Key = key;
Value = value;
}
public TKey Key { get; set; }
public TValue Value { get; set; }
}
我正在尝试将自定义 class 序列化为 XML。这是 class:
[Serializable()]
[XmlRoot("KVP")]
public class SerializableKeyValuePair<TKey, TValue>
{
public SerializableKeyValuePair()
{ }
public SerializableKeyValuePair(TKey key, TValue value)
{
Key = key;
Value = value;
}
public TKey Key { get; set; }
public TValue Value { get; set; }
}
这是尝试序列化它的代码:
var xmlWriter = new StringWriter();
Type[] extraTypes = new Type[1] { typeof(SerializableKeyValuePair<string, string>) };
var xmlSerializer = new XmlSerializer(typeof(List<SerializableKeyValuePair<string, string>>), extraTypes);
xmlSerializer.Serialize(xmlWriter, functions);
xmlRet = xmlWriter.ToString();
这是实际结果:
<ArrayOfSerializableKeyValuePairOfStringString>
<SerializableKeyValuePairOfStringString>
<Key>Min</Key>
<Value>Min</Value>
</SerializableKeyValuePairOfStringString>
<SerializableKeyValuePairOfStringString>
<Key>MinAvgMax</Key>
<Value>MinAvgMax</Value>
</SerializableKeyValuePairOfStringString>
</ArrayOfSerializableKeyValuePairOfStringString>
我想看的是下面的,但是好像没有使用我定义的XmlRoot。谁能帮我弄清楚如何获得这个 XML 结构?
<ArrayOfKVP>
<KVP>
<Key>Min</Key>
<Value>Min</Value>
</KVP>
<KVP>
<Key>MinAvgMax</Key>
<Value>MinAvgMax</Value>
</KVP>
</ArrayOfKVP>
TIA!
但是 SerializableKeyValuePair
不是根,List<SerializableKeyValuePair<string, string>>
是!
我想你在找 XmlType
:
[XmlType("KVP")]
public class SerializableKeyValuePair<TKey, TValue>
{
//...
}
如果您想更改列表的元素名称,可以在创建序列化程序时提供 XmlRootAttribute
:
var serializer = new XmlSerializer(typeof(List<SerializableKeyValuePair<string, string>>),
null, extraTypes, new XmlRootAttribute("ArrayOfKVP"), string.Empty);
顺便说一句,Serializable
与XmlSerializer
无关。除非您出于其他目的需要它,否则可以将其删除。
首先可以尝试select序列化之前的KVP数组
var xKVP = xDoc.Root.Descendants().FirstOrDefault(d => d.Name.LocalName.Equals("car"));
var serializer = new XmlSerializer(typeof(SerializableKeyValuePair<string, string>));
using (var reader = xKVP.CreateReader())
{
var result = (SerializableKeyValuePair<string, string>) serializer.Deserialize(reader);
Console.WriteLine(result.Key);
Console.WriteLine(result.Value);
}
另一种方式,您可以为您的 KVP 数组创建一个包装器
[XmlRoot("ArrayOfKVP")]
class ArrayOfKVP
{
public ArrayOfKVP() {}
[XmlElement("KVP")]
public List<Foo> KVPList {get; set;}
}
[Serializable()]
[XmlType("KVP")]
public class SerializableKeyValuePair<TKey, TValue>
{
public SerializableKeyValuePair()
{ }
public SerializableKeyValuePair(TKey key, TValue value)
{
Key = key;
Value = value;
}
public TKey Key { get; set; }
public TValue Value { get; set; }
}