使用protobuf-net,是否有可能利用Zigzag编码来处理负整数?
当尝试序列化具有负值的对象属性时,protobuf-net会回落到fixed32/fixed64编码,而不是高效的Zigzag编码。
例如。
[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用于负数将违背原本出色的线压缩的目的。
请协助!
问候你,迈克
发布于 2011-07-27 13:20:40
当然;protobuf有几种不同的编码;您在这里需要的是zig-zag编码:
[ProtoMember(1, DataFormat = DataFormat.ZigZag)]在protobuf-net中有xml注释:
/// <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>
ZigZaghttps://stackoverflow.com/questions/6831426
复制相似问题