即使使用FixedLength byteArray,也应始终应用OverwriteList

时间:2012-09-06 07:40:16

标签: protobuf-net

我已经阅读了protobuf中字节数组处理的几个问题,并且只是想确保我正确地做了一些事情。如果每次加载/保存我的字节大小增加时省略OverwriteList。如果您使用数组或列表来为该属性提供默认值时始终指定覆盖,那么正确的方法是什么?

[ProtoContract]
class Settings
{
    public Settings()
    {
        AccessCode = new byte[6];
        Message = "hello";
        Random r = new Random();
        r.NextBytes(AccessCode);
    }

    [ProtoMember(1, OverwriteList=true)]
    public byte[] AccessCode { get; set; }

    [ProtoMember(2)]
    public string Message { get; set; }
}

我正在使用protobuf的Souce 2.0.0.569。

    static void Main()
    {
        using (MemoryStream ms = new MemoryStream())
        {
            Settings s = new Settings();
            Display(s);

            Serializer.Serialize<Settings>(ms, s);

            ms.Seek(0, SeekOrigin.Begin);

            Settings newSettings = Serializer.Deserialize<Settings>(ms);
            Display(newSettings);
        }
    }

    static void Display(Settings s)
    {
        Console.WriteLine("Access Code Length = {0} Message = {1}", s.AccessCode.Length, s.Message);

    }

1 个答案:

答案 0 :(得分:2)

实际上,在你的情况下,我会说最合适的解决方案是:

[ProtoContract(SkipConstructor = true)]
class Settings
{
    public Settings()
    {
        AccessCode = new byte[6];
        Message = "hello";
        Random r = new Random();
        r.NextBytes(AccessCode);
    }

    [ProtoMember(1)]
    public byte[] AccessCode { get; set; }

    [ProtoMember(2)]
    public string Message { get; set; }
}

没有指定OverwriteList。这将避免额外的冗余初始化步骤。

解释OverwriteList:由google设计的protobuf旨在可追加和合并。因此,对于多值数据(列表,数组等),规范行为是在最后附加新值; OverwriteList允许新值替换旧值 - 但另一种方法很简单:没有任何旧值。

作为无关的说明; new Random()会导致混淆的情况,即在紧密循环中创建的一组对象具有相同的值。如果这可能是一个问题,请考虑使用static实例,例如:

static readonly Random rand = new Random();

public Settings()
{
    AccessCode = new byte[6];
    Message = "hello";
    lock(rand)
    {
        rand.NextBytes(AccessCode);
    }
}