首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >protobuf-net处理负整数

protobuf-net处理负整数
EN

Stack Overflow用户
提问于 2011-07-26 22:15:49
回答 1查看 445关注 0票数 1

使用protobuf-net,是否有可能利用Zigzag编码来处理负整数?

当尝试序列化具有负值的对象属性时,protobuf-net会回落到fixed32/fixed64编码,而不是高效的Zigzag编码。

例如。

代码语言:javascript
复制
[ProtoContract]
internal class TestPoint
{
    [ProtoMember(1)]
    internal long Value;
}

var p = new TestPoint() { Value = -150 };

序列化为11个字节。

代码语言:javascript
复制
var p = new TestPoint() { Value = 150 };

序列化为3个字节。

来自ProtoWriter.cs:

代码语言:javascript
复制
            case WireType.Variant:
                if (value >= 0)
                {
                    WriteUInt64Variant((ulong)value, writer);
                    writer.wireType = WireType.None;
                }
                else
                {
                    DemandSpace(10, writer);
                    ...

有没有一种方法可以修饰序列化类中的成员以使用WireType.SignedVariant?在源代码中找不到任何方法来做到这一点。

否则,将protobuf用于负数将违背原本出色的线压缩的目的。

请协助!

问候你,迈克

EN

回答 1

Stack Overflow用户

发布于 2011-07-27 13:20:40

当然;protobuf有几种不同的编码;您在这里需要的是zig-zag编码:

代码语言:javascript
复制
[ProtoMember(1, DataFormat = DataFormat.ZigZag)]

在protobuf-net中有xml注释:

代码语言:javascript
复制
/// <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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6831426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档