私の質問は、参照型のシリアル化されたサイズ(バイト単位)を判別できるかどうかです。
状況は次のとおりです。
BinaryFormatterクラスを使用して、基本的な.NETタイプをシリアル化します。たとえば、次のようになります。
[Serializable]
public class Foo
{
public string Foo1 { get; set; }
public string Foo2 { get; set; }
}
各アイテムをbyte[]にシリアル化し、そのセグメントを既存のbyte []の最後に追加し、さらに各セグメントの最後にキャリッジリターンを追加してオブジェクトを区切ります。
デシリアライズするには、次のようにMarshal.ReadByte()を使用します。
List<byte> buffer = new List<byte>();
for (int i = 0; i < MapSize; i++)
{
byte b = Marshal.ReadByte(readPtr , i);
if (b != delim) // read until encounter a carriage return
buffer.Add(b);
else
break;
}
readPtr = readPtr + buffer.Count + 1; // incrementing the pointer for the next object
return buffer.ToArray();
Marshal.Copy()を使用する方が効率的だと思いますが、シリアル化されたバイトセグメントの長さを事前に知っておく必要があります。シリアル化されているタイプからこれを確実に計算できる方法、または使用できる全体的により効率的な方法はありますか?
また、最終的には、キャリッジリターンの使用は信頼できません。したがって、BinaryFormatterをカスタマイズするか、他の標準化されたベストプラクティスを使用して、オブジェクトを区切るためのより標準的な方法があるかどうか疑問に思っています。たとえば、BinaryFormatterのシリアル化が一般的なList <>の場合、オブジェクトを区切る特定の方法はありますか?