- 追加された行はこの色です。
- 削除された行はこの色です。
&tag(XmlSerializer);
*目次 [#y61751b1]
#contents
*参考情報 [#x4026846]
*Tips [#u0f52fc8]
**多態性への対応 [#q41b2f63]
-List<T>や配列にTを派生したクラスのオブジェクトをいれてシリアライズしたい場合そのままではエラーになる。
***参考リンク [#z3541ab6]
-[[C#::ポリモーフィックな型のXMLシリアライズ(1) - 虚飾の王:http://d.hatena.ne.jp/lord_hollow/20090831/p2]]
-[[C#::ポリモーフィックな型のXMLシリアライズ(2) - 虚飾の王:http://d.hatena.ne.jp/lord_hollow/20090901/p2]]
-[[How to: Control Serialization of Derived Classes:http://msdn.microsoft.com/en-us/library/3z3z5s6h(v=vs.80).aspx]]
-[[@IT:連載:.NETで簡単XML 第11回 オブジェクトをXMLでシリアライズ(3):http://www.atmarkit.co.jp/fdotnet/easyxml/easyxml11/easyxml11_01.html]]…派生クラスを含む配列
***基本 [#u59f09f9]
-次の場合そのままではシリアライズできず例外が発生する。
-派生クラスのオブジェクトを基本クラスの変数にいれてシリアライズしたい場合。
-Listや配列に派生したクラスのオブジェクトをいれてシリアライズしたい場合。
***サンプル [#l9eef352]
-Person(基本クラス)
#pre{{
// [XmlInclude(typeof(Player))]
// [XmlInclude(typeof(Coach))]
public class Person
{
public string Name { get; set; }
}
}}
-Player(派生クラス1)
#pre{{
public class Player :Person
{
public string Position { get; set; }
}
}}
-Coach(派生クラス2)
#pre{{
public class Coach :Person
{
public string Type { get; set; }
}
}}
-Team(とりまとめクラス)。XmlArrayItemに含まれる派生クラスをすべて列挙する。これがないと例外発生。
#pre{{
public class Team
{
public Team()
{
Persons = new List<Person>();
}
[XmlArrayItem(typeof(Player))]
[XmlArrayItem(typeof(Coach))]
public List<Person> Persons { get; set; }
[XmlElement(typeof(Player))]
[XmlElement(typeof(Coach))]
//
public Person MainPerson { get; set; }
}
}}
-シリアライズ実行
#pre{{
Team team = new Team();
team.Persons.Add(new Player()
{
Name = "小野伸二",
Position = "MF"
});
Player kagawa = new Player()
{
Name = "香川真司",
Position = "FW"
};
team.Persons.Add(kagawa);
team.Persons.Add(new Coach()
{
Name = "ジーコ",
Type = "自由"
});
team.MainPerson = kagawa;
XmlSerializer serializer = new XmlSerializer(typeof(Team));
FileStream fs = new FileStream("c:/temp/test.xml", FileMode.Create);
serializer.Serialize(fs, team);
fs.Close();
}}
-結果のXML。MainPersonはXmlElement指定の影響で、タグがPlayerにかわっている。
#pre{{
<?xml version="1.0"?>
<Team xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Persons>
<Player>
<Name>小野伸二</Name>
<Position>MF</Position>
</Player>
<Player>
<Name>香川真司</Name>
<Position>FW</Position>
</Player>
<Coach>
<Name>ジーコ</Name>
<Type>自由</Type>
</Coach>
</Persons>
<Player>
<Name>香川真司</Name>
<Position>FW</Position>
</Player>
</Team>
}}
-Personクラスに、XmlInclude指定をつけ、XmlElement指定を外した場合つぎのようになる。
#pre{{
<?xml version="1.0"?>
<Team xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Persons>
<Person xsi:type="Player">
<Name>小野伸二</Name>
<Position>MF</Position>
</Person>
<Person xsi:type="Player">
<Name>香川真司</Name>
<Position>FW</Position>
</Person>
<Person xsi:type="Coach">
<Name>ジーコ</Name>
<Type>自由</Type>
</Person>
</Persons>
<MainPerson xsi:type="Coach">
<Name>ジーコ</Name>
<Type>自由</Type>
</MainPerson>
</Team>
}}