gpt4 book ai didi

java - Protobuf 将序列化为空字节双倍

转载 作者:行者123 更新时间:2023-12-01 22:14:53 25 4
gpt4 key购买 nike

我使用 Google Protobuf 2.6.1 创建了一个非常简单的 java 类,其结构如下:

required int64 tid = 1;
required int64 tid = 1;
required string clOrdID = 2;
required string execID = 3;
required string ticketType = 4;
optional string lastMkt = 5;
required double lastQty = 6;
required double cumQty = 7;
required double lastPx = 8;
required double avgPx = 9;
optional string lastCapacity = 10;
required int64 transactionTime = 11;
required int64 reportTime = 12;

构建类并使用测试数据填充这些字段后,我使用 .toByteArray() 方法将其转换为字节数组:

double d = 99.0;
FillProto fillProto = FillProto.newBuilder()
.setTid(n)
.setClOrdID("ClOrdID")
.setExecID("ExecID")
.setTicketType("ticketType")
.setLastMkt("LastMkt")
.setLastQty(d)
.setCumQty(d)
.setLastPx(d)
.setAvgPx(d)
.setLastCapacity("LastCapacity")
.setTransactionTime(now.getTime())
.setReportTime(now.getTime())
.build();

Log.info(class_,method_,"Sending through:\n" + new String(fillProto.toByteArray()));

我通过 Solace 队列发送 ByteArray,在另一端使用后,我尝试使用 FillProto.parseFrom(byte[]) 构建另一个对象,但收到错误:“解析协议(protocol)消息时,输入意外地结束在田野中央。” ByteArray 看起来看起来不错,直到标记为 double 的字段都输出为 null(00 字节)。有谁知道这里发生了什么吗?

下面的字节数组:

  08 05 12 07 63 6c 4f 72    64 49 44 1a 06 65 78 65    ....clOrdID..exe
63 49 44 22 0a 74 69 63 6b 65 74 54 79 70 65 2a cID".ticketType*
07 6c 61 73 74 4d 6b 74 31 00 00 00 00 00 c0 58 .lastMkt1......X
40 39 00 00 00 00 00 c0 58 40 41 00 00 00 00 00 @9......X@A.....
c0 58 40 49 00 00 00 00 00 c0 58 40 52 0c 4c 61 .X@I......X@R.La
73 74 43 61 70 61 63 69 74 79 58 b0 8b a8 ce e6 stCapacityX.....
29 60 b0 8b a8 ce e6 29 )`.....)

最佳答案

这是正常的。 double 使用标准 8 字节 IEEE-754 表示法表示。 double 值零表示为全零,大多数其他值也将包含零。

听起来您的消息传递基础设施旨在处理以 NUL 结尾的文本字符串。此类基础设施不适用于原始 Protobuf 内容,因为它会在第一个 NUL 字节处截断消息。一般来说,您不能在为文本设计的上下文中使用原始 Protobuf 数据,因为可能会发生各种损坏。请特别注意,您永远不应该将 protobuf 字节传递给 new String(),因为 String 存储 Unicode 文本,而不是字节。

如果您需要在需要文本的地方传输 Protobuf,则需要对数据进行 Base64 编码以防止此类损坏 - Base64 允许将原始字节放置在文本上下文中,但会增加数据的总体大小33%。

关于java - Protobuf 将序列化为空字节双倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31276675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com