在 xml c# 的反序列化期间更改元素的名称
Changing an element's name during deserialization of xml c#
我有一个 class 看起来像这样:
[XmlType(TypeName = "rootType")]
public class myClass
{
public Class1 class1;
public Class2 class2;
[XmlType(TypeName = "type1")]
public class class1
{ ... class1 definition ...}
[XmlType(TypeName = "type2")]
public class class2
{ ... class1 definition ...}
}
当我序列化它时,生成的 xml 将是
<rootType>
<class1>
... some stuff
<class1/>
<class2>
... some stuff
<class2/>
<rootType/>
但是,我的问题是这些 xml 类型装饰刚刚添加到 class,这意味着在以前的版本(客户使用的版本)中 xml 看起来像
<myClass>
<type1>
... some stuff
<type1/>
<type2>
... some stuff
<type2/>
<myClass/>
有没有一种方法可以控制反序列化过程(或任何其他解决此问题的方法),如果可能,并且能够使用这些 XmlType 装饰将此 xml 反序列化为 myClass?
你的问题彻底解决了。
首先,当您创建序列化程序时,添加一个具有所需名称的 XmlRootAttribute
参数。
其次,将事件处理程序添加到序列化程序。
var serializer = new XmlSerializer(typeof(myClass), new XmlRootAttribute("myClass"));
serializer.UnknownElement += Serializer_UnknownElement;
事件处理程序应如下所示:
void Serializer_UnknownElement(object sender, XmlElementEventArgs e)
{
myClass my = (myClass)e.ObjectBeingDeserialized;
if (e.Element.Name == "type1")
{
var ser = new XmlSerializer(typeof(myClass.Class1));
using (var sr = new StringReader(e.Element.OuterXml))
my.class1 = (myClass.Class1)ser.Deserialize(sr);
}
else if (e.Element.Name == "type2")
{
var ser = new XmlSerializer(typeof(myClass.Class2));
using (var sr = new StringReader(e.Element.OuterXml))
my.class2 = (myClass.Class2)ser.Deserialize(sr);
}
}
一如既往地使用:
myClass my;
using (var fs = new FileStream("test.xml", FileMode.Open))
my = (myClass)serializer.Deserialize(fs);
它应该有效。
我有一个 class 看起来像这样:
[XmlType(TypeName = "rootType")]
public class myClass
{
public Class1 class1;
public Class2 class2;
[XmlType(TypeName = "type1")]
public class class1
{ ... class1 definition ...}
[XmlType(TypeName = "type2")]
public class class2
{ ... class1 definition ...}
}
当我序列化它时,生成的 xml 将是
<rootType>
<class1>
... some stuff
<class1/>
<class2>
... some stuff
<class2/>
<rootType/>
但是,我的问题是这些 xml 类型装饰刚刚添加到 class,这意味着在以前的版本(客户使用的版本)中 xml 看起来像
<myClass>
<type1>
... some stuff
<type1/>
<type2>
... some stuff
<type2/>
<myClass/>
有没有一种方法可以控制反序列化过程(或任何其他解决此问题的方法),如果可能,并且能够使用这些 XmlType 装饰将此 xml 反序列化为 myClass?
你的问题彻底解决了。
首先,当您创建序列化程序时,添加一个具有所需名称的 XmlRootAttribute
参数。
其次,将事件处理程序添加到序列化程序。
var serializer = new XmlSerializer(typeof(myClass), new XmlRootAttribute("myClass"));
serializer.UnknownElement += Serializer_UnknownElement;
事件处理程序应如下所示:
void Serializer_UnknownElement(object sender, XmlElementEventArgs e)
{
myClass my = (myClass)e.ObjectBeingDeserialized;
if (e.Element.Name == "type1")
{
var ser = new XmlSerializer(typeof(myClass.Class1));
using (var sr = new StringReader(e.Element.OuterXml))
my.class1 = (myClass.Class1)ser.Deserialize(sr);
}
else if (e.Element.Name == "type2")
{
var ser = new XmlSerializer(typeof(myClass.Class2));
using (var sr = new StringReader(e.Element.OuterXml))
my.class2 = (myClass.Class2)ser.Deserialize(sr);
}
}
一如既往地使用:
myClass my;
using (var fs = new FileStream("test.xml", FileMode.Open))
my = (myClass)serializer.Deserialize(fs);
它应该有效。