2014-02-04 1 views
2

Когда я сериализовать этот объект с буферами протокола в Java, я получаю этот байтовый массив:Почему байт [] отличается при сериализации с буферами протоколов для java и protobuf-net?

byte[] topic = Transport.newBuilder() 
      .setTopic(Topics.ORD) 
      .setExtension(Ord.command, Commands.INSERT) 
      .build() 
      .toByteArray(); 

// [8,2,16,0] 

Когда я делаю то же самое с Protobuf-сеть, я получаю это

var transport = new Transport 
{ 
    topic = Topics.ORD, 
    command = Commands.INSERT 
}; 

var stream = new MemoryStream(); 
Serializer.Serialize(stream, transport); 
byte[] result = stream.ToArray(); // [8,2] 

Это вызывает у меня некоторые проблема при использовании zmq и подписки на основе массива bye. Как я могу убедиться, что оба массива будут выглядеть одинаково?

ответ

2

protobuf-net, в v1, сделал предположение «нулевые значения по умолчанию». Вероятно, это не решение, которое я бы сделал снова, если бы я начинал с нуля, и действительно, это поведение можно отключить в версии v2. Но, как он есть, во многих случаях он принимает нуль как неявное значение по умолчанию. Я предполагаю, что ваш command не является обнуляемым перечислением, в этом случае оно будет применять эту логику (как побочное примечание: если она была обнуляемым, было бы не сделать это - было бы использовать null чек для решения include/exclude).

Из-за этого он решил, что второе поле (поле № 2, закодированное как varint) не нужно сериализовать. Следовательно, нет [16, 0].

Варианты:

  • используют обнуляемого элемент (эквивалентный optional) - т.е. public SomeEnum? Command {get;set;}
  • маркировать элемент, как требуется (IsRequired=true на ProtoMemberAttribute)
  • выключают неявный ноль по умолчанию поведение (UseImplicitZeroDefaults по делу RuntimeTypeModel)
+0

Хорошо, я установил поле в файле proto. Теперь я получаю '[8,2,176,6,0]' в C# и '[8,2, -80,6,0]' в Java – mrt181

+2

@ mrt181, это просто потому, что java подписал байты, а C# имеет неподписанные байты; 176 и -80 - одно и то же (двоичный 10110000) –

Смежные вопросы