ProtoBuf-Net Сжатие уже сжатого?

Как буфер протокола будет обрабатывать сжатие уже сжатого byte[]?

Псевдопример:

[ProtoContract]
class Foo
{
  [ProtoMember(1)]
  public string Bar{ get; set; }

  [ProtoMember(2)]
  public byte[] CompressedFoo { get; set; }
}


// proto is my ProtocolBuffer.Net utility class

Foo _foo = new Foo() { Bar = "Hello World"; };

Foo _foo2 = new Foo() { Bar = "Goodbye cruel world"; };
_foo2.CompressedFoo = proto.Compress(_foo);

byte[] compressedFoo2 = proto.Compress(_foo2);

person user1412044    schedule 23.05.2012    source источник


Ответы (1)


Спецификация protobuf не включает какое-либо сжатие, если только вы не считаете varint кодировку целочисленных данных. byte[] в C# рассматривается как тип protobuf bytes, что означает, что это просто необработанный дамп байтов с префиксом длины. Итак, если CompressedFoo (просто для примера) 12 байтов, он будет сериализовать его в 14 байтов, состоящих из:

  • 1 байт для типа данных (2, для обозначения префикса длины) и номера поля (2, из [ProtoMember(2)]), смешанного («сдвинутого») вместе и закодированного варинтом
  • 1 байт для длины данных (12), в кодировке varint
  • 12 байт для данных (взято "как есть" из CompressedFoo)
person Marc Gravell    schedule 23.05.2012
comment
Спасибо за ответ. Я задал еще один вопрос по этой ссылке: stackoverflow.com/questions /10719169/протобуф-сетевая производительность - person user1412044; 23.05.2012