私の質問は、参照型のシリアル化されたサイズ(バイト単位)を決定できるかどうかです。.NETタイプと管理されていないメモリ効率のシリアル化されたサイズの決定
相続人の状況:
私はすなわち、たとえば、基本的な.NET型をシリアル化するためにBinaryFormatterクラスを使用しています:
[Serializable]
public class Foo
{
public string Foo1 { get; set; }
public string Foo2 { get; set; }
}
私がいることを追加した後、[]バイトに各項目をシリアル化していますセグメントを既存のバイト[]の終わりまで追加し、オブジェクトの境界を定めるために各セグメントの最後にキャリッジリターンを追加します。私は(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でシリアル化がGeneric List <>のように指定されている場合、そのオブジェクトを区切る具体的な方法がありますか?
これは危険です。シリアライズされたデータ自体に値13のバイトが表示されたらどうなりますか? IMO **固定長(通常は4または8バイト)のネットワークバイトオーダーのエンコーディング、またはエキゾチックな感じの場合は "varint"エンコーディングのようなものを使用して**プレフィックス**を付ける必要があります –
@MarcGravell、ありがとうございます。キャリッジは一時的な解決策として返されます。長さの接頭辞の考えは良いです、私はそれを使用すると思います。 –
実際には、長さの区切りをまったく行う必要はありません。 BinaryFormatterは、完全なエンクロージャをデシリアライズしたときを認識します。 –