在 Java 和 C++ 应用程序中使用 protobuf 进行解析时出错
Error during parsing with protobuf in Java and C++ Application
我尝试使用 protobuf 在两个 java 应用程序(客户端和服务器)之间进行消息交换。
protobuf 代码完全用 C++ 开发(TLS client/server 逻辑也是如此)。 'raw' protobuf classes 由 C++ 代码包装在一个简单的 C++ class 中,它只是将方法调用委托给原始 protobuf 代码。此 C++ 包装器再次使用 SWIG 包装 Java。*
我用以下调用填充 java 客户端中的 protobuf:
Message msg = new Message();
msg.setUser("test");
msg.setPassword("pwd");
这会将信息委托给 C++ 包装器,然后从那里委托给 protbuf。数据传输正确,但如果我尝试在 java 服务器端解析序列化数据,解析失败:
Message message = new Message();
boolean p = message.parse(data); // will call ParseFromString(data); on C++ layer with try catch
但是在服务器应用程序的 c++ 层上它工作正常。
我比较了 C++ 和 Java 层(服务器端)上的 'raw' protobuf 数据,发现它们看起来不同:
//c++
test�pwd
//java
testÿpwd
Whosebug 上没有显示长度信息,但在 java 和 c++ 上是相同的。
是什么导致了这种差异?编码有问题吗?
(*) 我决定采取这个额外的步骤,因为在这种情况下,SWIG 的所有 protobuf 逻辑都是隐藏的。
注意:我只处理字符串并使用 C++ 中的 parseFromString
和 SerializeAsString
。 Java 不直接调用此方法。
编辑:
消息还有两个字段 'bool success' 和 'string name'。如果我将它们都删除,解析工作(用户和 pwd 之间的符号消失了)。为什么?
message Message{
required string user = 1;
optional string pwd = 2;
//optional string name = 3;
//optional bool success = 4;
}
编辑
确实是 Java 字符串编码的问题。另请参阅我的其他相关问题
查看 protobuf java api,它总是使用 "byte[]" 作为序列化数据。我怀疑您有问题,因为 java 字符串与 C++ 字符串不同。我将 byte[] 专门用于 Java.
中的数据
我尝试使用 protobuf 在两个 java 应用程序(客户端和服务器)之间进行消息交换。 protobuf 代码完全用 C++ 开发(TLS client/server 逻辑也是如此)。 'raw' protobuf classes 由 C++ 代码包装在一个简单的 C++ class 中,它只是将方法调用委托给原始 protobuf 代码。此 C++ 包装器再次使用 SWIG 包装 Java。*
我用以下调用填充 java 客户端中的 protobuf:
Message msg = new Message();
msg.setUser("test");
msg.setPassword("pwd");
这会将信息委托给 C++ 包装器,然后从那里委托给 protbuf。数据传输正确,但如果我尝试在 java 服务器端解析序列化数据,解析失败:
Message message = new Message();
boolean p = message.parse(data); // will call ParseFromString(data); on C++ layer with try catch
但是在服务器应用程序的 c++ 层上它工作正常。
我比较了 C++ 和 Java 层(服务器端)上的 'raw' protobuf 数据,发现它们看起来不同:
//c++
test�pwd
//java
testÿpwd
Whosebug 上没有显示长度信息,但在 java 和 c++ 上是相同的。
是什么导致了这种差异?编码有问题吗?
(*) 我决定采取这个额外的步骤,因为在这种情况下,SWIG 的所有 protobuf 逻辑都是隐藏的。
注意:我只处理字符串并使用 C++ 中的 parseFromString
和 SerializeAsString
。 Java 不直接调用此方法。
编辑: 消息还有两个字段 'bool success' 和 'string name'。如果我将它们都删除,解析工作(用户和 pwd 之间的符号消失了)。为什么?
message Message{
required string user = 1;
optional string pwd = 2;
//optional string name = 3;
//optional bool success = 4;
}
编辑
确实是 Java 字符串编码的问题。另请参阅我的其他相关问题
查看 protobuf java api,它总是使用 "byte[]" 作为序列化数据。我怀疑您有问题,因为 java 字符串与 C++ 字符串不同。我将 byte[] 专门用于 Java.
中的数据