最简单的事情,我想是分开控制反序列化。我查找了XmlElement属性的别名,但我没有看到类似的东西。此外,当您再次序列化对象时,它将如何知道应该使用哪个标签。
一旦你从你的第二个对象反序列化,代码就不会那么难以创建第一个类的新实例并复制属性。
你也可以做这样的事情,这使得一个非常擅长阅读的类,但是你不应该使用这个类来写或者它会写所有的属性。
VB.NET
<XmlRoot("PersonList")> _
Public Class PersonList
<XmlElement("person")> _
Public Property People() As Person()
Get
Return m_People
End Get
Set
m_People = Value
End Set
End Property
Private m_People As Person()
End Class
Public Class Person
Private _name As String
<XmlElement("name")> _
Public Property Name() As String
Get
Return _name
End Get
Set
_name = value
End Set
End Property
<XmlElement("name_person")> _
Public Property NamePerson() As String
Get
Return _name
End Get
Set
_name = value
End Set
End Property
End Class
C#
[XmlRoot("PersonList")]
public class PersonList {
[XmlElement("person")]
public Person[] People { get; set; }
}
public class Person {
private String _name;
[XmlElement("name")]
public String Name {get{return _name;} set{_name = value;}}
[XmlElement("name_person")]
public String NamePerson {get{return _name;} set{_name = value;}}
}
参考:XML deserialize: different xml schema maps to the same C# class
或者,它看起来像你可以使用你原来的班,但随后处理XmlSerializer.UnknownElement事件。
(未经测试) VB.Net
Private Shared Sub serializer_UnknownElement(sender As Object, e As XmlElementEventArgs)
Dim target = DirectCast(e.ObjectBeingDeserialized, Person)
If e.Element.Name = "name_person" Then
target.Name = e.Element.InnerText
End If
End Sub
C#
static void serializer_UnknownElement(object sender, XmlElementEventArgs e)
{
var target = (Person) e.ObjectBeingDeserialized;
if(e.Element.Name == "name_person")
{
target.Name = e.Element.InnerText;
}
}
但同样,这不会让你回来从你的旧格式保存为旧格式,只加载到您的新班。
参考:http://weblogs.asp.net/psteele/archive/2011/01/31/xml-serialization-and-the-obsolete-attribute.aspx
参考:http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.unknownelement.aspx
来源
2013-07-23 18:17:24
Ted
如果使用File-> String-> XMLObject,则可以使用字符串函数修复标记。 – rheitzman
在我的属性类中,是否可以确定正在读取的文件的类型,然后通知它有关要查找的标记名称。 例如如果Filename =“xml1”,那么 _ 其他 _ –
user2092583