protobuf 解码中的非法组结束指示符错误
Illegal group end indicator error in protobuf decode
当我尝试使用 protobuf.js decode
解码 bytearray 时出现以下错误
错误:消息 .SampleMessage 的非法组结束指示符:1749(不是组)
出错时(本机)
在 ProtoBuf.Reflect.MessagePrototype.decode (http://127.0.0.1:53259/libs/protobuf/dist/ProtoBuf.js:3168:31)
在 Function.Message.decode (http://127.0.0.1:53259/libs/protobuf/dist/ProtoBuf.js:2896:37)
代码片段:
sample.proto - 文件
message SampleMessage {
required string text = 1;
}
Java code For encode:
SampleMessage msg = SampleProto.SampleMessage.newBuilder().setText("test data ").build();
ObjectOutputStream out = new ObjectOutputStream(response.getOutputStream());
out.writeObject(msg);
out.flush();
使用javascript解码:
var ProtoBuf = dcodeIO.ProtoBuf;
var SampleMessage = ProtoBuf.loadProtoFile("com/cm/model/sample.proto").build("SampleMessage");
var msg = SampleMessage.decode(response.data);
我强烈怀疑是这个问题:
ObjectOutputStream out = new ObjectOutputStream(response.getOutputStream());
out.writeObject(msg);
为什么要使用 ObjectOutputStream
?这是 Java 的本机二进制序列化协议, 与 Protocol Buffers 不同。即使 protobuf 一些 支持 Java 的序列化(这样如果你已经在使用内置序列化,你仍然可以序列化 protobuf 消息)你不应该除非你在 both 端使用 Java 序列化,否则不要使用它。
你应该使用
SampleMessage msg = SampleProto.SampleMessage.newBuilder().setText("test data ").build();
msg.writeTo(response.getOutputStream());
当我尝试使用 protobuf.js decode
解码 bytearray 时出现以下错误错误:消息 .SampleMessage 的非法组结束指示符:1749(不是组) 出错时(本机) 在 ProtoBuf.Reflect.MessagePrototype.decode (http://127.0.0.1:53259/libs/protobuf/dist/ProtoBuf.js:3168:31) 在 Function.Message.decode (http://127.0.0.1:53259/libs/protobuf/dist/ProtoBuf.js:2896:37)
代码片段: sample.proto - 文件
message SampleMessage {
required string text = 1;
}
Java code For encode:
SampleMessage msg = SampleProto.SampleMessage.newBuilder().setText("test data ").build();
ObjectOutputStream out = new ObjectOutputStream(response.getOutputStream());
out.writeObject(msg);
out.flush();
使用javascript解码:
var ProtoBuf = dcodeIO.ProtoBuf;
var SampleMessage = ProtoBuf.loadProtoFile("com/cm/model/sample.proto").build("SampleMessage");
var msg = SampleMessage.decode(response.data);
我强烈怀疑是这个问题:
ObjectOutputStream out = new ObjectOutputStream(response.getOutputStream());
out.writeObject(msg);
为什么要使用 ObjectOutputStream
?这是 Java 的本机二进制序列化协议, 与 Protocol Buffers 不同。即使 protobuf 一些 支持 Java 的序列化(这样如果你已经在使用内置序列化,你仍然可以序列化 protobuf 消息)你不应该除非你在 both 端使用 Java 序列化,否则不要使用它。
你应该使用
SampleMessage msg = SampleProto.SampleMessage.newBuilder().setText("test data ").build();
msg.writeTo(response.getOutputStream());