我正在尝试解码消息包有效负载。它们的有效负载使用以下代码编写
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中正确解码有效负载中的所有结构。我能找到榜样。
答案 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,请阅读mark
和reset
:https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html