使用protobuf-net,是否可以利用Zigzag编码进行负数整数?
尝试序列化具有负值的对象属性时,protobuf-net会回退到fixed32 / fixed64编码而不是有效的Zigzag编码。
E.g。
[ProtoContract]
internal class TestPoint
{
[ProtoMember(1)]
internal long Value;
}
var p = new TestPoint() { Value = -150 };
序列化为11个字节。
var p = new TestPoint() { Value = 150 };
序列化为3个字节。
来自ProtoWriter.cs:
case WireType.Variant:
if (value >= 0)
{
WriteUInt64Variant((ulong)value, writer);
writer.wireType = WireType.None;
}
else
{
DemandSpace(10, writer);
...
有没有办法装饰序列化类中的成员以使用WireType.SignedVariant?无法在源代码中找到任何方法。
否则,使用protobuf作为负数可能会导致电线压缩效果不佳。
请协助!
此致 麦克
答案 0 :(得分:1)
不确定; protobuf有一些不同的编码;你想要的是zig-zag编码:
[ProtoMember(1, DataFormat = DataFormat.ZigZag)]
在protobuf-net中有xml-comment:
/// <summary>
/// When applied to signed integer-based data (including Decimal), this
/// indicates that zigzag variant encoding will be used. This means that values
/// with small magnitude (regardless of sign) take a small amount
/// of space to encode.
/// </summary>
ZigZag