Google协议缓冲区错误:“在序列化协议缓冲区时遇到包含无效UTF-8数据的字符串”

时间:2013-02-28 15:32:26

标签: protocol-buffers

我正在使用以下代码

int lenSend = odl->ByteSize();
char* buf = (char *)malloc(lenSend);
odl->SerializeToArray(buf, lenSend);

我收到此错误,我无法理解为什么会得到它(是的,我得到它三次):

  

libprotobuf ERROR google / protobuf / wire_format.cc:1059]在序列化协议缓冲区时遇到包含无效UTF-8数据的字符串。字符串必须只包含UTF-8;对原始字节使用'bytes'类型。
  libprotobuf ERROR google / protobuf / wire_format.cc:1059]在序列化协议缓冲区时遇到包含无效UTF-8数据的字符串。字符串必须只包含UTF-8;对原始字节使用'bytes'类型。
  libprotobuf ERROR google / protobuf / wire_format.cc:1059]在序列化协议缓冲区时遇到包含无效UTF-8数据的字符串。字符串必须只包含UTF-8;对原始字节使用'bytes'类型。

感谢。

4 个答案:

答案 0 :(得分:7)

您可以按照消息中的建议消除警告!

您必须在odl(在您的.proto文件中)的定义中有一个或多个字段,这些字段定义为string,但您要将非UTF-8字符放入其中。 The docs state that you shouldn't do this。如果您将这些更改为bytes,警告就会消失。

答案 1 :(得分:0)

string字符串必须始终包含UTF-8编码或7位ASCII文本。 string String str / unicode [4]

bytes可包含任意字节序列。 string ByteString str

有时您应该使用字节而不是字符串!

答案 2 :(得分:0)

使用byte []替换字符串,其编码不是UTF-8或ASCII。

答案 3 :(得分:0)

转换 []byte 进行翻译

示例:

message Data {
    Object obj = 1;
}

如果<grpc: failed to unmarshal the received message string field contains invalid UTF-8>

# marshal object
message Data {
    bytes encodeObject = 1;
}
# unmarshal object