我正在使用gSoap将传统的C++系统重构为SOA。我们有一些性能问题(非常大的XML文件),因此我的主管要求我看看协议缓冲区。我看了一下,它看起来非常酷(我们需要C++和Java支持)。然而,协议缓冲区仅是用于序列化的解决方案,现在我需要将其发送到Java前端。从C++和Java的角度来看,我应该使用什么方法来通过HTTP(仅限内部网络)发送这些序列化内容?
PS. 另一个人试图加速我们的gSoap解决方案,但我只对协议缓冲区感兴趣。
我正在使用gSoap将传统的C++系统重构为SOA。我们有一些性能问题(非常大的XML文件),因此我的主管要求我看看协议缓冲区。我看了一下,它看起来非常酷(我们需要C++和Java支持)。然而,协议缓冲区仅是用于序列化的解决方案,现在我需要将其发送到Java前端。从C++和Java的角度来看,我应该使用什么方法来通过HTTP(仅限内部网络)发送这些序列化内容?
PS. 另一个人试图加速我们的gSoap解决方案,但我只对协议缓冲区感兴趣。
您可以通过HTTP请求或HTTP响应发送二进制负载。只需将协议缓冲区的字节直接写入请求/响应中,并确保将内容类型设置为“application/octet-stream”。客户端和服务器可以轻松处理其余内容。我认为在任何一端都不需要更多特殊处理。
application/x-protobuf
格式:http://www.slideshare.net/mokeefe/javaone-2009-ts5276-restful-protocol-buffers - Tim SylvesterProtoBuf是一种二进制协议。它与SOAP不兼容。我建议你要么坚持使用gSOAP,要么完全转换为ProtoBuf。
使用protoBuf,你需要用类似于下面这样的特殊格式来定义你的协议:
message Product {
required string id = 1;
required string description = 2;
required int32 quantity = 3;
optional bool discontinued = 4;
}
<代码>protoc工具可以生成C++/Java/Python代码,以便您可以在一端对其进行序列化,并在另一端进行反序列化。message Envelope {
enum Type {
SEARCH = 1;
SEARCH_RESPONSE = 2;
RETRIEVE = 3;
RETRIEVE_RESPONSE = 4;
}
required Type type = 1;
required bytes encodedMessage = 2;
message Header {
required string key = 1;
required bytes value = 2;
}
repeated Header headers = 3;
}
encodedMessage
是另一个序列化的ProtoBuf消息。现在SOAP头中的所有内容都会被放入headers
中。
SOAP_XML_TREE
标志或使用-DWITH_NOIDREF
进行编译。如果没有此标志,则由于SOAP编码具有多个ref元素(id-ref)来序列化图形(即检测共同引用的对象,分析循环数据结构等),性能可能会大大降低。建议的标志关闭此功能以将XML序列化为树形结构。消息传递速度得到极大提高。性能的唯一瓶颈是网络延迟和带宽。 - Dr. Alex RE