2017-11-23 8 views
0

メッセージパックのペイロードをデコードしようとしています。これらは、ペイロードは、私が正しく理解していれば、ペイロードは今一緒に追加される2 msgpackエンコードされたスタックが含まれている次のコードmsgpack-jacksonを使用して、javaで複数のアイテムを持つMsgPackペイロードをデコードしてください。

var w bytes.Buffer 

testBatch := []Event{ 
    exampleEvent, 
    exampleEvent, 
} 

for _, e := range testBatch { 
    data, err := e.MarshalMsg(nil) 
    if err != nil { 
     t.Fatalf("MarshalMsg failed: %v", err) 
    } 
    if _, err := w.Write(data); err != nil { 
     t.Fatalf("Write: %v", err) 
    } 
} 

// w.Bytes() now contain bytes that java will read. 

に行くに書かれています。 Javaで復号化のために

、私は次のようlibaray

POJO

にメッセージをデコード扱うプロジェクトはmsgpackジャクソンが含まれている

https://github.com/msgpack/msgpack-java

を使用している私は、javaの最初のメッセージをデコードするために管理します

ObjectMapper objectMapper = new ObjectMapper(new MessagePackFactory()); 
Event events1 = objectMapper.readValue(in, Event.class); 

// Event events2 = objectMapper.readValue(in, Event.class); // this doesn't work 

events1が正しく復号された最初の構造体が含まれていますが、次のコードを使用して私は2番目の構造体を取得できませんでした。

コメント解除events1ラインが私の目標は、Javaで正しく復号ペイロード内のすべての構造体を得ることです、次のエラーに

com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input 
at [Source: [email protected]; line: -1, column: 0] 

を与えます。私は例を見つけることができた。

答えて

0

まあ、私はあなたのin変数が入力ストリームであると仮定しています:

InputStream in = [..]// get the input stream somehow 
Event events1 = objectMapper.readValue(in, Event.class); 
Event events2 = objectMapper.readValue(in, Event.class); 

あなたがたInputStreamからバイトを読んだとき、ストリームの位置が前方に移動します。各read()は次のバイトだけを読み込みます。

最初のobjectValue.readValue()の後に、ストリームの位置はデータの最後にあります。それで、あなたは "終わりの入力"を得るのです。

InputStreamの位置を変更するだけで済みます(サポートされている場合)。 (または、それはあなたが望むものであるならば、新しいInputStreamを作成します。)

InputStreamを再配置するために、およそmarkresetをお読みください。https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html

関連する問題