обработка protobuf-net для отрицательных целых - PullRequest
1 голос
/ 26 июля 2011

Используя protobuf-net, возможно ли использовать зигзагообразную кодировку для отрицательных целых чисел?

При попытке сериализации свойств объекта, имеющих отрицательные значения, protobuf-net возвращается к кодированию fixed32 / fixed64 вместо эффективной кодировки Zigzag.

* 1005 Е.Г. *

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

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

С уважением, Mike

1 Ответ

1 голос
/ 27 июля 2011

Конечно; 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
...