обработка 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 для отрицательных чисел сведет на нет цель превосходного сжатия проводов.

Пожалуйста помогите!

С уважением, Майк


person ionwarp    schedule 26.07.2011    source источник
comment
stackoverflow.com/questions/41692470/ номер # сэр, мне нужна ваша помощь, что у меня такой же вопрос?   -  person qsmy_qin    schedule 17.01.2017


Ответы (1)


Конечно; protobuf имеет несколько разных кодировок; то, что вы хотите здесь, это зигзагообразное кодирование:

[ProtoMember(1, DataFormat = DataFormat.ZigZag)]

который имеет xml-комментарий в protobuf-net:

/// <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
person Marc Gravell    schedule 27.07.2011