2015-08-19 12 views
5

Bir protobuf nesnesini Ruby'de serileştirmenin ve Java'da ayrıştırmanın doğru yolu nedir? Bu otomatik test için, bu mesajı bir Rabbit kuyruğunda dinliyoruz.Ruby ve Java arasında protobuf nesnesini serileştirme/ayrıştırma nasıl yapılır?

Yayıncı (Yakut):

protoNew = Protobuf::Request.new 
protoNew.request = request 
protoNew.id = id.to_i 
protoNew.authentication = authentication 

return protoNew.serialize_to_string 

Tüketici (Java):

çözümlenirken hata protobuf: com.google İşte

@Override 
    public void onMessage(Message message, Channel channel) 
    { 
     ProtoRequest protoRequest; 
     try { 
      protoRequest = ProtoRequest.parseFrom(message.getBody()); 
     } catch (InvalidProtocolBufferException e1) { 
      logger.error("Error parsing protobuf", e1); 
     } 

görüyorum hatadır. protobuf.InvalidProtocolBufferException: Protokol ileti uç grup etiketi beklenen etiketle eşleşmedi. com.google.protobuf.InvalidProtocolBufferException.invalidEndTag (InvalidProtocolBufferException.java:94) en [protobuf-java 2.6.1.jar:] com.google.protobuf.CodedInputStream.checkLastTagWas (CodedInputStream.java:174) en [protobuf -java-2.6.1.jar:] com.google.protobuf.AbstractParser.parsePartialFrom adresinde (AbstractParser.java:139) [protobuf-java-2.6.1.jar:] com.google.protobuf.AbstractParser adresinde. parseFrom (AbstractParser.java:168) [protobuf-java-2.6.1.jar:] , com.google.protobuf.AbstractParser.parseFrom'da (AbstractParser.java:180) [protobuf-java-2.6.1.jar:] Com.google.protobuf.AbstractParser.parseFrom adresinde (AbstractParser.java:185) [protobuf-java-2.6.1.jar:] com.google.protobuf.AbstractParser.parseFrom'da (AbstractParser.java:49) [protobuf -java-2.6.1.jar:]

cevap

1

protoNew.serialize_to_string çıkışını, Java Kodu için JMS iletisinin içeriğine dönüşecek şekilde nasıl paketlediğiniz açık değildir. Char kodlama nedeniyle bir şeyler karışıyor sanırım.

Çevrede bir çalışma olarak, protoNew.serialize_to_string'un ikili çıktısının Base 64 kodlamasını yapabilir ve Java ucunda Base 64 kod çözme işlemini yapabilirsiniz. Yukarıdaki çözüm hakkında kötü Java Tarafında

require "base64" 
... 
return Base64.encode64 protoNew.serialize_to_string 

,

import org.apache.commons.codec.binary.Base64; 
... 
protoRequest = ProtoRequest.parseFrom(Base64.decodeBase64(message.getBody())) 

bir şey saf ikili forma kıyasla daha büyük yükü boyutu neden olacaktır.

PS: Ben Ruby tarafında bir dosyaya person.serialize_to_string çıktısını yazmak ve Java üzerinde o dosyayı okursanız,

f = File.open("data.dat", "wb") 
f << person.serialize_to_string 
f.close 
+0

Teşekkür iyi iş gibi görünüyor unutmayınız! Bu küçük bir değişiklik ile çalıştı, "protoRequest = ProtoRequest.parseFrom (Base64.decode (new String (message.getBody()))) kullanarak bitti;" java tarafında, message.getBody() bir bayt dizisi döndürdüğü için. – crobicha

İlgili konular