0

辞書をできるだけ早くファイルに保存する必要があります。キーと値はどちらもオブジェクトであり、Serializableとしてマークされる保証はありません。また、何千ものオブジェクトをシリアル化するよりも高速な方法を好みます。そこで、.NET 4でのマップトメモリファイルのサポートを調べました。ただし、MemoryMappedViewAccessorは構造体の格納のみを許可し、参照型は許可しないようです。

参照型のファイルで使用されるメモリを保存し、そのメモリのブロブからオブジェクトを再構築する方法はありますか(バイナリシリアル化なし)?

4

3 に答える 3

1

メモリのブロブを格納することは、そのメモリが参照型を持っている場合、次にファイルにアクセスしたときに適用されない可能性が高い他のメモリブロックへのポインタを持っているため、単純に機能しないと思います。これが、バイナリシリアル化が存在する理由です。これらの種類の参照を維持するためです。ただし、本当に厳密な制御が必要な場合は、System.IO.BinaryWriterとBinaryReaderを使用して、オーバーヘッドを最小限に抑えながら、ファイルに書き込まれる順序を正確に完全に制御します。

于 2010-04-27T16:35:41.900 に答える
1

メモリマップトファイルは、基本的にガベージコレクタと互換性がありません。そのため、このような主要なオペレーティングシステム機能が.NETでサポートされるまでに非常に長い時間がかかりました。参照型は、MMFビューであるMemoryMappedViewStreamにシリアル化する必要があります。これを回避する方法はありません。アンマネージコードにも同様の制限があります。ポインタのあるオブジェクトはフラット化して、ポイントされたオブジェクトがビューにも表示されるようにする必要があります。

それらをMMFにシリアル化するかファイルにシリアル化しても違いはありませんが、ファイルシステムキャッシュはMMFでも実装されます。書き込まれたデータが使用可能なマップ可能なメモリに収まる限り、ファイルの書き込みは非常に高速です。それが問題である場合は、64ビットオペレーティングシステムを調べてその問題を解決してください。

于 2010-04-27T17:29:32.667 に答える
0

これは、バイナリシリアル化が設計されたタイプのシナリオです。それを使いたくない特別な理由はありますか?「遅すぎる」ことを確認しましたか?もちろん、独自のカスタムシリアライザーをコーディングして、特定のシナリオでより効率的にすることもできますが、その後はそれを維持する必要があります。努力する価値はありますか?

于 2010-04-27T16:32:02.417 に答える