我已经阅读了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);
}
答案 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);
}
}