protobuf-net处理负数

时间:2011-07-26 14:15:49

标签: protobuf-net

使用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作为负数可能会导致电线压缩效果不佳。

请协助!

此致 麦克

1 个答案:

答案 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