我有一个看起来像这样的课程:
[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?
答案 0 :(得分:0)
你的问题已经彻底解决了。
首先,在创建序列化程序时,添加具有所需名称的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);
一如既往地使用:
def convert(userInput):
english = userInput.getText()
obish = 'ob'
if len(original) > 0 and original.isalpha():
word = english.lower()
x = word[0]
if x == "a" or x == "e" or x == "i" or x == "o" or x == "u":
obWord = word + ob
print (obWord)
else:
print ('')
else:
print ('empty')
它应该有用。