GAMMD rev.3

気ままにメモ

c#で抽象クラスのシリアライズについて

抽象クラスを継承したクラスをシリアライズする場合、どうも情報が落ちる場合があります。

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Info>
<ErrorMessage>era</ErrorMessage>
<hoge>えらーです</hoge>
</Info>
</ArrayOfInfo>

このシリアライズしたオブジェクトはもともとErrorMessageをスーパークラスのプロパティとして設定していた。

きっちりと子クラスでオブジェクトを作ると情報が落ちない。

var resultObject = new Info[] { new Info() };

抽象化すると落ちる。

AbstractInfo f = new Info();
var resultObject = new AbstractInfo[] { f };

おそらく、継承クラスを複数種類作ってシリアライズしようとした時と同じイメージで、シリアライズでエラーにはならないけど情報が落ちているのだと思います。

AbstractInfo f = new Info();// AbstractInfoを継承したクラス
AbstractInfo f = new Info2();//Infoを継承したクラス
var resultObject = new AbstractInfo[] { f,f2 };

なんてすると、此奴何がしたいのか分からないようになるからだと思う。。
シリアライズするときはインスタンスも厳密なクラスにしたほうが無難。