:この方法で定義する
も暗黙的にXmlInclude
属性が
サンプル定義を必要とされていない、知られている派生型を作りますデシリアライズする。 " これは、定義上は偽です。
public class BaseClass {
public string Name {get;set;}
}
[XmlRoot("BaseClass")]
public class ChildClass : BaseClass {
public int Value {get;set;}
}
[XmlRoot("BaseClass")]
public class FlatClass
{
public string Name {get;set;}
public int Value {get;set;}
}
XmlSerializer ser1 = new XmlSerializer(typeof(BaseClass));
XmlSerializer ser2 = new XmlSerializer(typeof(ChildClass));
XmlSerializer ser3 = new XmlSerializer(typeof(FlatClass));
ser1.Serialize(File.Open("ser1.xml", FileMode.Create), new BaseClass(){Name="Base"});
ser2.Serialize(File.Open("ser2.xml", FileMode.Create), new ChildClass(){Name="Child",Value = 1});
ser1.Deserialize(File.OpenRead("ser2.xml"));
ser2.Deserialize(File.OpenRead("ser1.xml"));
ser3.Deserialize(File.OpenRead("ser2.xml"));
ブーム。作品はちょうど罰金!!!!! シリアライゼーションは、3つの方法で完全に完全になります。結果のオブジェクトはいずれの側でも100%ではないかもしれませんが、逆直列化しています。 デシリアライズser2.xml SER2はser1.xml
をデシリアライズするとき、このモデルを壊すだけの事はある値propertuyをスキップするときSER1は、Value要素を無視します:
ser1.Serailize(File.Open("ser3.xml", FileMode.Create), new ChildClass(){Name = "Child2", Value = 2});
XmlSerialize ser3 = new XmlSerializer(typeof(FlatClass));
ser3.Deserialize(File.OpenRead("ser3.xml"));
この最後の休憩、シリアライザbecuase BaseClassは要素のxsi:type = "ChildClass"属性を含むスキーマ標準に従います(ただし、必要な時間の99%は貴重です)。 Ser3はそのタイプには対応していないため、特にFlatClassがWANまたはLAN回線を介して別のアセンブリに存在する場合は、そのタイプを処理できません。 Honey-badgerと同じように、XmlSerailizerは要素や値を見つけることができ、スキーマ内の何もプロセスを中断しない限り、要素や値については気にしません。 XSI:TYPE属性は、スキーマを中断します。
たとえば、サービスにFlatClassというクラスがある場合、WCFまたは他のXML通信ベースのシステムを使用する場合、xsi:type = ""属性を含むChildClassをDESERIALIZEしません。ただし、シリアライザをBaseClassに使用しない場合は、xsi:type属性を使用しないで、まったく同じXMLを逆シリアル化します。
Q.E.D. 多くの場合、時間が有益で、必要であり、理想的です。には、にxsi:type属性が含まれています。
したがって、XmlSerializerをBaseClass型用に作成し、子型をシリアル化するときにxsi:type属性を含めないように指示する方法がありますか?
おかげ Jaeden "SIFO Dyas" al'Raec Ruiner
あなたがシリアライズするクラスのコードを提供することができますか? – Seb