为什么不序列化我的 protobuf?
Why not serialize my protobuf?
我的widgets.proto:
option java_package = "example";
option java_outer_classname = "WidgetsProtoc";
message Widget {
required string name = 1;
required int32 id = 2;
}
message WidgetList {
repeated Widget widget = 1;
}
我的休息:(路径:/widgets)
@GET
@Produces("application/x-protobuf")
public WidgetsProtoc.WidgetList getAllWidgets() {
Widget widget1 =
Widget.newBuilder().setId(1).setName("testing").build();
Widget widget2 =
Widget.newBuilder().setId(100).setName("widget 2").build();
System.err.println("widgets1: " + widget1);
System.err.println("widgets2: " + widget2);
WidgetsProtoc.WidgetList list = WidgetsProtoc.WidgetList.newBuilder().addWidget(widget1).addWidget(widget2).build();
System.err.println("list: " + list.toByteArray());
return list;
}
当我使用邮递员时,我得到了这样的回复:
(emptyline)
(emptyline)
testing
(emptyline)
widget 2d
这正常吗?我认为不是真的......在我的 messagebodywriter class 中,我像这样覆盖 writeto:
@Override
public void writeTo(WidgetsProtoc.WidgetList widgetList, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
entityStream.write(widgetList.toByteArray());
}
我认为发送一个字节数组很好...但是不序列化任何内容有点奇怪...或者只是我的 ID...感谢您的帮助:)
已经是二进制了。
您是否注意到您的消息由名称和 ID 组成,但只显示名称?
这就是我将响应保存为来自浏览器的 GET 调用的 "test" 文件时显示的内容:
$ cat test
testing
widget 2d%
你可以看到 cat 勉强能显示出来,但是里面有更多的内容。
现在,如果我在 bless(ubuntu 中的十六进制编辑器)中打开它,我可以从中获得更多信息
0A 0B 0A 07 74 65 73 74 69 6E 67 10 01 0A 0C 0A 08 77 69 64 67 65 74 20 32 10 64
一般来说,我不相信 Postman 会显示二进制数据。你需要知道如何解码它,而 Postman 显然不知道。
这是最后的证明:
$ cat test | protoc --decode_raw
1 {
1: "testing"
2: 1
}
1 {
1: "widget 2"
2: 100
}
我的widgets.proto:
option java_package = "example";
option java_outer_classname = "WidgetsProtoc";
message Widget {
required string name = 1;
required int32 id = 2;
}
message WidgetList {
repeated Widget widget = 1;
}
我的休息:(路径:/widgets)
@GET
@Produces("application/x-protobuf")
public WidgetsProtoc.WidgetList getAllWidgets() {
Widget widget1 =
Widget.newBuilder().setId(1).setName("testing").build();
Widget widget2 =
Widget.newBuilder().setId(100).setName("widget 2").build();
System.err.println("widgets1: " + widget1);
System.err.println("widgets2: " + widget2);
WidgetsProtoc.WidgetList list = WidgetsProtoc.WidgetList.newBuilder().addWidget(widget1).addWidget(widget2).build();
System.err.println("list: " + list.toByteArray());
return list;
}
当我使用邮递员时,我得到了这样的回复:
(emptyline)
(emptyline)
testing
(emptyline)
widget 2d
这正常吗?我认为不是真的......在我的 messagebodywriter class 中,我像这样覆盖 writeto:
@Override
public void writeTo(WidgetsProtoc.WidgetList widgetList, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
entityStream.write(widgetList.toByteArray());
}
我认为发送一个字节数组很好...但是不序列化任何内容有点奇怪...或者只是我的 ID...感谢您的帮助:)
已经是二进制了。 您是否注意到您的消息由名称和 ID 组成,但只显示名称? 这就是我将响应保存为来自浏览器的 GET 调用的 "test" 文件时显示的内容:
$ cat test
testing
widget 2d%
你可以看到 cat 勉强能显示出来,但是里面有更多的内容。
现在,如果我在 bless(ubuntu 中的十六进制编辑器)中打开它,我可以从中获得更多信息
0A 0B 0A 07 74 65 73 74 69 6E 67 10 01 0A 0C 0A 08 77 69 64 67 65 74 20 32 10 64
一般来说,我不相信 Postman 会显示二进制数据。你需要知道如何解码它,而 Postman 显然不知道。
这是最后的证明:
$ cat test | protoc --decode_raw
1 {
1: "testing"
2: 1
}
1 {
1: "widget 2"
2: 100
}