3

私はprotobuf-netシリアライザーを使用していますが、今までは完璧に機能していました. 一部のプライベート整数メンバーをシリアル化する必要がある場合がありますが、シリアル化の前にそれらをバイト配列に収集し、逆シリアル化でバイト配列から抽出する必要がありますが、逆シリアル化でバイト配列のサイズが変更されます。

次のコードでは、整数を含むクラスを使用してこの問題を簡略化し、説明しています。シリアル化するときは、それを長さ 4 のバイト配列に変換するゲッターを介してアクセスします。デシリアライゼーションでは、プロセスは逆になりますが、セッターはサイズの 2 倍 (8) のバイト配列を割り当てたため、エラーが発生しました。この種の変換を行うことはできませんか?

サイズ 8 のバイト配列の最後の 4 つのエントリには、実際にはシリアル化された値が含まれていることに注意してください。なんで?

によって返される配列はPrivateValueis: です[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);
        }
    }
}
4

2 に答える 2

2

さらに調査した結果、この投稿protobuf-net OverwriteList on Byte Array on SO を見つけました。これは、protobuf のバグであり、将来のバージョンで解決される必要があることを説明しています。

于 2012-04-12T12:31:41.790 に答える
0

私の推測では、Valueフィールドもシリアル化しています。無視するようにマークしてみて、それが役立つかどうかを確認してください。

[ProtoIgnore]
public int Value { get; set; }
于 2012-04-12T12:03:36.740 に答える