最簡單的事情,我想是分開控制反序列化。我查找了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