バイナリフォーマッタを使用したオブジェクトのシリアライズ/デシリアライズについてお聞きしたいです。さて、1つずつシリアル化された多くのオブジェクトを含む FileStream のオブジェクトを逆シリアル化しようとしています。オブジェクトのサイズが大きすぎてプロセス メモリに保存できないため、次のようにすべてのオブジェクトを 1 つにまとめることはしません。この方法では、すべてのオブジェクトではなく1つのオブジェクトを交互に処理するだけなので、多くのプロセスメモリを必要としません。私が意味するスケッチを見てください
<FileStream>
----Object 1-----Size = 100 Mb------index = 0
----Object 2-----Size = 100 Mb------index = 1
----Object 3-----Size = 100 Mb------index = 2
----Object 4-----Size = 100 Mb------index = 3
----Object 5-----Size = 100 Mb------index = 4
----Object 6-----Size = 100 Mb------index = 5
</FileStream>
オブジェクトのシリアル化も正常に行われ、オブジェクトを逆シリアル化する際に問題が発生しました。ここに問題があります。リストでは、インデックスを持つアイテムを取得できます。したがって、5 番目のインデックスを取りたい場合は、次のように呼び出すことができます。
List<object> list = new List<object>();
list(0) = "object1";
list(1) = "object2";
list(2) = "object3";
list(3) = "object4";
list(4) = "object5";
list(5) = "object6";
object fifthIndex = list[5]; // here we can get item based index
問題は、Binary Formatter を使用して、ファイルストリーム内の 6 つの Deserialization オブジェクトのList メソッドのように、5 番目のインデックスを持つオブジェクトを取得する方法です。FileStream には「FileStream.Position」という名前のプロパティがあることは知っていますが、Index が好きではありません。オブジェクトを逆シリアル化/シリアル化すると、乱数のように見えます。多分それは乱数を増やします。
実際に私はこれで成功しましたが、これは私が今まで試した私のコードを見て最善の方法ではないと確信しています:
object GetObjectStream(FileStream fs, int index)
{
if (fs != null)
{
BinaryFormatter binaryformatter = new BinaryFormatter();
bool isFinished = false; int count = 0;
while (isFinished == false)
{
try
{
object objectdeserialized = binaryformatter.Deserialize(fs);
if (count == index) return objectdeserialized;
count++;
}
catch
{
isFinished = true;
return null;
}
}
}
return null;
}
これらのコードは、シリアル化されたすべてのオブジェクトを「foreach」し、すべてのオブジェクトを逆シリアル化します。100 MB を含むオブジェクトをデシリアライズするには時間がかかる可能性があるため、コードが最善の方法ではないに違いありません。デシリアライズされるインデックス以外のオブジェクトが破棄されるかどうかさえわかりません。「Serialization Leap」のようなメソッドが欲しい。
この問題を解決できれば、あなたの答えは私にとって非常に役に立ちます。
前にありがとう..