バイナリフォーマッタ

昨日書こうと思ったけど時間がなかったので。
.NET の型は、SerializableAttribute と NonSerializeAttributae を適切に付与するだけで、バイナリフォーマッタが結構簡単にオブジェクトをシリアライズ/デシリアライズしてくれるし、完了イベントやデシリアライズ後のクラスの変更やら、お手軽である。
このバイナリフォーマッタによる自動シリアライズだが、中途半端に CLSCompliant な型を要求するので注意しなければならない。たとえば、C# では言語制約上コンパイルエラーとなるが、.NET のメンバフィールドの名前はフィールドの定義型が異なれば同じ名前にすることができる。*1

[Serializable]
public class Test
{
  private int a;
  private long a;
  private object a;
}

こんな感じのイメージ。これをバイナリフォーマッタに食わせると、"a" という名前で情報を3回登録しようとして失敗するし、他にも Type.GetField(string) の戻り値が FieldInfo[] ではなく FieldInfo なところからして、こういうクラスの作成はプログラム言語がサポートしている場合でも避けたほうがよい。
誰も好き好んでこんなクラス作らないだろうけど。

*1:当然、CLSCompliant ではない型になる