BinaryFormatterで大量データを扱うと例外が発生。

ある程度の大きさを持ったオブジェクトをシリアライズしてみた。

System.Runtime.Serialization.SerializationException:内部配列を Int32.MaxValue 要素を超えて展開することはできません。

えっ!?

相変わらず意味不明のエラー吐きやがる。
途中まで作られたと見られるファイルサイズ見てもそんなにサイズ大きくないのになとか思いつつ調べてると。
Binary serialization fails for moderately large object graphs

ふぉー。
はぁ、バグすか。そーすか。

言われたとおりおとなしく DataContractSerializer でも使うか。

FileStream stream = File.Open( @"C:\temp\data.dat", FileMode.Create );
XmlDictionaryWriter writer = XmlDictionaryWriter.CreateBinaryWriter( stream );

var source = CreateSource();

DataContractSerializer serializer = new DataContractSerializer( source.GetType() );
serializer.WriteObject( writer, source );

writer.Close();
stream.Close();

それにしても、なんでこう type を欲しがるのかね。GetType くらい呼んでくれYOって思うのはオレだけか?
まぁ、入れたい型が違うにしても、typeof使えよって話があってもいいけど、オーバーロードで指定なしくらい用意してくれてもいいだろうに。

ついでに復元。

FileStream stream = File.Open( @"C:\temp\data.dat", FileMode.Open );
XmlDictionaryReader reader = XmlDictionaryReader.CreateBinaryReader(
  stream, null, new XmlDictionaryReaderQuotas()
);

DataContractSerializer serializer = new DataContractSerializer( typeof( object ) );
object obj = serializer.ReadObject( reader );

reader.Close();
stream.Close();

こっちはさすがに指定なしとはいかないか。
それにしても null 指定させんなハゲとは思ったが。