C# XmlSerializer未使用类上定义的XmlRoot
我正在尝试将自定义类序列化为XML。下面是课堂:C# XmlSerializer未使用类上定义的XmlRoot,c#,xml,serialization,xmlserializer,C#,Xml,Serialization,Xmlserializer,我正在尝试将自定义类序列化为XML。下面是课堂: [Serializable()] [XmlRoot("KVP")] public class SerializableKeyValuePair<TKey, TValue> { public SerializableKeyValuePair() { } public SerializableKeyValuePair(TKey key, TValue value) { Key = key
[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; }
}
[Serializable()]
[XmlRoot(“KVP”)]
公共类SerializableKeyValuePair
{
public SerializableKeyValuePair()
{ }
public SerializableKeyValuePair(TKey-key,TValue-value)
{
钥匙=钥匙;
价值=价值;
}
公钥{get;set;}
公共TValue值{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();
var xmlWriter=new StringWriter();
Type[]extraTypes=新类型[1]{typeof(SerializableKeyValuePair)};
var xmlSerializer=新的xmlSerializer(typeof(List),extraTypes);
序列化(xmlWriter,函数);
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>
分钟
分钟
米纳夫格马克斯
米纳夫格马克斯
蒂亚 但是
SerializableKeyValuePair
不是根,List
是
我想你在寻找:
另一方面,
Serializable
与XmlSerializer
无关。除非您出于其他目的需要它,否则可以将其删除。首先,您可以在序列化之前尝试选择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);
}
var xKVP=xDoc.Root.subjections().FirstOrDefault(d=>d.Name.LocalName.Equals(“car”);
var serializer=新的XmlSerializer(typeof(SerializableKeyValuePair));
使用(var reader=xKVP.CreateReader())
{
var result=(SerializableKeyValuePair)序列化程序。反序列化(读取器);
控制台写入线(结果键);
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; }
}
[XmlRoot(“ArrayOfKVP”)]
类ArrayOfKVP
{
公共数组fkvp(){}
[XmlElement(“KVP”)]
公共列表KVPList{get;set;}
}
[可序列化()]
[XmlType(“KVP”)]
公共类SerializableKeyValuePair
{
public SerializableKeyValuePair()
{ }
public SerializableKeyValuePair(TKey-key,TValue-value)
{
钥匙=钥匙;
价值=价值;
}
公钥{get;set;}
公共TValue值{get;set;}
}
感谢您的回复。第一个选项对我来说是不可行的,第二个不是有效的示例,因为数组类需要知道key&value的数据类型。我真的很想使用现有的序列化技术,但我不明白为什么使用XmlRoot至少在转换为时不起作用。就是这样!我知道这不是我的根,但文档说我不能在类级别使用XmlElement,我误解了XmlType的用途。谢谢你让我明白过来!
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);
}
[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; }
}