最も簡単なことは、逆シリアル化を個別に制御することだと思います。XmlElement 属性のエイリアスを探しましたが、そのようなものは見つかりませんでした。さらに、オブジェクトを再度シリアライズするとき、使用するタグをどのように知るのでしょうか。
2 番目のオブジェクトから逆シリアル化すると、最初のクラスの新しいインスタンスを作成し、プロパティをコピーすることはコードで難しくありません。
このようなことを行うこともできます。これにより、読み取りに優れたクラスが作成されますが、このクラスを書き込みに使用しないでください。そうしないと、すべてのプロパティが書き込まれます。
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 デシリアライズ: 異なる XML スキーマが同じ C# クラスにマップされる
または、元のクラスを使用できるように見えますが、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