使用msgpack-jackson在java中使用多个项解码MsgPack有效负载

时间:2017-11-23 10:53:24

标签: java jackson 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.

如果我理解正确,有效载荷现在包含2个msgpack编码堆栈,它被附加在一起。

在java中进行解码,我正在使用以下libaray

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

该项目包含处理解码消息到POJO的msgpack-jackson

我设法使用以下代码解码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包含第一个正确解码的结构,但我没有设法获得第二个结构。

取消评论events1行会出现以下错误

com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
 at [Source: java.io.ByteArrayInputStream@2374d36a; line: -1, column: 0]

我的目标是在java中正确解码有效负载中的所有结构。我能找到榜样。

1 个答案:

答案 0 :(得分:0)

好吧,我假设你的in变量是一个InputStream:

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,请阅读markresethttps://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html