私はprotobuf-netシリアライザーを使用していますが、今までは完璧に機能していました. 一部のプライベート整数メンバーをシリアル化する必要がある場合がありますが、シリアル化の前にそれらをバイト配列に収集し、逆シリアル化でバイト配列から抽出する必要がありますが、逆シリアル化でバイト配列のサイズが変更されます。
次のコードでは、整数を含むクラスを使用してこの問題を簡略化し、説明しています。シリアル化するときは、それを長さ 4 のバイト配列に変換するゲッターを介してアクセスします。デシリアライゼーションでは、プロセスは逆になりますが、セッターはサイズの 2 倍 (8) のバイト配列を割り当てたため、エラーが発生しました。この種の変換を行うことはできませんか?
サイズ 8 のバイト配列の最後の 4 つのエントリには、実際にはシリアル化された値が含まれていることに注意してください。なんで?
によって返される配列はPrivateValue
is: です[54, 100, 0, 0]
が、デシリアライズ時に指定される配列は is:[0, 0, 0, 0, 54, 100, 0, 0]
です。
[ProtoBuf.ProtoContract]
class SerializeTest
{
public int Value { get; set; }
[ProtoBuf.ProtoMember(1)]
private byte[] PrivateValue
{
get
{
return new byte[4]
{
(byte)(Value),
(byte)(Value >> 8),
(byte)(Value >> 16),
(byte)(Value >> 24)
};
}
set
{
// For some reasone is the given byte array is always twice the size
// and all the values are in the last part og the array
this.Value = ((int)value[3] << 24) | ((int)value[2] << 16) | ((int)value[1] << 8) | value[0];
}
}
public override string ToString()
{
return this.Value.ToString();
}
}
class Program
{
static void Main(string[] args)
{
var a = new SerializeTest() { Value = 25654 };
using (var memStream = new MemoryStream())
{
// Serialize
ProtoBuf.Serializer.Serialize(memStream, a);
memStream.Position = 0;
// Deserialize
var data = ProtoBuf.Serializer.Deserialize<SerializeTest>(memStream);
// Writs 0 and not 25654
Console.WriteLine(data.Value);
}
}
}