0

オブジェクトをランダムアクセスファイルにシリアル化できないのはなぜですか?一方、オブジェクトをシーケンシャルアクセスファイルにシリアル化できますか?

"" C#は、実行時にオブジェクトのサイズを取得する手段を提供しません。これは、クラスをシリアル化した場合、固定長のレコードサイズ ""(私が読んだ本から)を保証できないことを意味します。

したがって、ファイル内のすべてのオブジェクトサイズがわからないため、ランダムアクセスファイルを読み取ることができません。

4

2 に答える 2

2

属性でマークされたオブジェクトはすべてSerializableAttributeシリアル化できます(ほとんどのシナリオで)。シリアル化の結果は常にストリームに送られます。ストリームはファイル出力ストリームである可能性があります。

オブジェクトグラフを部分的に逆シリアル化できない理由を尋ねていますか?.NETシリアル化は、完全なオブジェクトグラフのみを[逆]シリアル化します。それ以外の場合は、他のシリアル化フォーマッターを使用するか、独自に作成する必要があります。

ファイルに直接ランダムアクセスするには、シークをサポートするストリームでファイルを開く必要があります。

編集:

シリアル化の結果のストリームを探すことには実用的な目的はありません。とにかくそこに何があるかを知っているのはシリアル化フォーマッターだけであり、常にストリームの最初の部分にフィードする必要があります。

データを他の構造に永続化するため。2段階のプロセスで実行します。最初に、シリアル化バイトを[つまりメモリでバックアップされた]ストリームにターゲティングします。このストリームは後でサイズを読み取ることができ、次にサイズの知識を使用して実際のバッキングストアにデータを書き込みます。

シリアル化された表現はランタイム表現と大きく異なる可能性があるため、シリアル化されたオブジェクトのサイズを予測することはできません。

プリミティブ型のみを使用し、BinaryWriterを使用して書き込む場合でも、出力サイズを正確に制御することは可能ですが、それ自体はシリアル化ではありません。

于 2009-08-23T14:32:37.337 に答える
0

.NET の既定のバイナリ シリアル化では、オブジェクト グラフ全体がシリアル化されます。オブジェクト グラフは、グラフであるという性質上、サイズが一定ではありません。つまり、各シリアル化オブジェクト (レコード) のサイズが一定ではなく、ランダム アクセスが妨げられます。 .

ファイル内の任意のレコードにランダムにアクセスできるようにするには、クラスのバイナリ シリアル化の独自の実装を作成するか、データベースを使用します。シンプルでインストール不要のシングル スレッド データベース エンジンが必要な場合は、SQL Server Compactを参照してください。

于 2009-08-23T15:30:09.583 に答える