[英]Changing an element's name during deserialization of xml c#
我有一堂課,看起來像這樣:
[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/>
但是,我的問題是,這些xmltype裝飾剛剛添加到了類中,這意味着在先前版本(客戶端使用的版本)中,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);
應該可以的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.