2009-07-16 4 views
2

これはC#3.0 Winformの問題です。MemoryStreamからDeserializeすると、C#でOutOfMemory例外がスローされる

私は大きな(実際には大きくない)複雑なオブジェクトをクローンしたいと思います。それを遅延させるために、私はそれをMemoryStreamにシリアル化し、BinaryFormatter.UnsafeDeserialize(MemoryStream、null)メソッドを使用してクローンオブジェクトを取得します。 UnsafeDeserialize()メソッドの内部には常にOutOfMemory例外がスローされます。メモリは十分なはずです。

これについては、.netバグとして少し読んでいますが、ここに該当するかどうかはわかりません。

これはなぜ起こっているのですか?どんなワークアラウンドですか?ありがとう。

+4

実際のコードを投稿できますか? –

+0

(コメントに返信) –

答えて

2

おそらく愚かな質問ですが、デシリアライズする前にMemoryStreamをストリームの先頭に巻き戻すことを覚えていますか?

あなたのコードの一部を共有することも役立ちます。

+0

はい、デシリアライズする前に位置を0に設定しました。 – Steve

1

なぜの代わりにUnsafeDeserializeを使用していますか?

+0

MSDNから: "完全信頼シナリオでは、UnsafeDeserializeはDeserializeよりも優れたパフォーマンスを提供します。" –

+0

それは分かっていませんでした! :)今私のもののためにそれを行う! (しかし私はそれがすでにかなり速いことを知っている)。 – leppie

1

オブジェクトとは何ですか、どの程度の大きさですか?

私は、同様の問題を抱えている他の人たちを見てきましたが、場合によっては別のシリアライザに切り替えて固定しました。私は、シナリオに応じて適切なものがいくつかあることを示唆することができます。特に - データa ツリーまたはグラフ? (つまり、子オブジェクトは、兄弟またはその親を参照するのか、それとも自分の子のみを参照するのか)。

+0

クラスはツリー構造です。 – Steve

+0

次に、おそらくprotobuf-netを考えてみましょう。高速かつ効率的な(空間的に)バイナリツリーシリアライザです。既存のBinaryFormatterシリアル化データとの互換性はないことに注意してください。警告:私は著者ですが、無料です。私はあなたに何かを売ろうとはしていない。 –

0

代わりにFileStreamを試して、ファイルの大きさを確認することをお勧めします。

+0

私はそれを試みました。ファイルはわずか58MBです。だから、メモリの問題は全くないはずです。 OutOfMemory例外がスローされると、アプリケーションは500MB未満しか使用しません。私は4Gのメモリを持っており、私は1つの.netアプリケーションが最大2Gのメモリを使用すると仮定します。 – Steve

関連する問題