ものがたり(旧)

atsushieno.hatenablog.com に続く

winfxのDataContractAttribute/DataMemberAttributeが、というよりはXmlFormatterが、service oriented approachだっていうのは、ややウソっぽいなという気がしている。


[DataContract]
public class Foo
{
[DataMember]
public ArrayList Hoge;
}

このクラスはSerializationMode.SharedContractでXmlFormatterを使ってもシリアライズ出来てしまう(Hogeに具体的なArrayListインスタンスを代入してみると分かりやすいかも)。

どうなっているのかというと、このArrayListは、SharedContractであるにもかかわらず、Serializableとしてシリアライズされているのである。つまり、SerializationMode.SharedTypeのシリアライゼーションと同じである。

実際、シリアライズしたいクラスに[DataContract]と[Serializable]を両方設定してやってみると、後者が優先的に適用されるように見える。

何でこんな設計になってしまったのだろうか? おそらく、DataContractという属性を、そのクラスを定義しているライブラリ自身で設定するだけでは、既存の(自分で書き換えられない)クラスには対応できず、そしてまともにDataContractをサポートするには、DataContractが必要になっているMSのライブラリは、既存クラスにべったり依存しすぎているのだろう(というか依存して当然)。

そんなわけで、本当にservice orientedなserializerを設計するんだったら、外部からマッピングしてやらなければならなかったのではないかと思われる。現在のDataContractの設計でdesign by contractと言うには、契約書に非記載事項が多すぎて意味をなしていないんじゃないかという気がする。

まあまだ結論を急げるほどXmlFormatterを知っているわけでもないのだけど。