我有一个要求,我需要在2个应用程序之间通过线路(通过tcp二进制)传输信息。一个是Java,另一个是C ++。我需要一个协议实现来在这两个应用程序之间传输对象。 Object类存在于两个应用程序中(相应地映射)。我只需要在一侧保留一些编码方案,在一侧保留Object表示,并在另一侧解码为完整的Object。
例如,
C ++类
class Person
{
int age;
string name;
};
Java类
class Person
{
int age;
String name;
}
C ++编码
Person p;
p.age = 20;
p.name = "somename";
char[] arr = SomeProtocolEncoder.encode(p);
socket.send(arr);
Java解码
byte[] arr = socket.read();
SomeProtocolIntermediateObject object = SomeProtocolDecoder.decode(arr);
Person p = (Person)ReflectionUtil.get(object);
协议应该提供一些维护对象表示状态的中间对象,以便使用反射我可以稍后返回对象。
答案 0 :(得分:5)
听起来像是你想要的Protobufs:http://code.google.com/apis/protocolbuffers/docs/tutorials.html
答案 1 :(得分:1)
查看Google的protocol buffers。
答案 2 :(得分:1)
Thrift正是您要找的。您只需创建需要调用的结构和方法的定义,它就可以完成所有繁重的任务。它有二进制协议(可选择使用zlib压缩或ssl)。它可能会征税,但你没有听到我的意见。
答案 3 :(得分:1)
您可能想要查看这些项目并选择一个:
答案 4 :(得分:1)
您可以查看amef协议,amef中的C ++编码示例就像是,
//Create a new AMEF object
AMEFObject *object = new AMEFObject();
//Add a child string object
object->addPacket("This is the Automated Message Exchange Format Object property!!","adasd");
//Add a child integer object
object->addPacket(21213);
//Add a child boolean object
object->addPacket(true);
AMEFObject *object2 = new AMEFObject();
string j = "This is the property of a nested Automated Message Exchange Format Object";
object2->addPacket(j);
object2->addPacket(134123);
object2->addPacket(false);
//Add a child character object
object2->addPacket('d');
//Add a child AMEF Object
object->addPacket(object2);
//Encode the AMEF obejct
string str = new AMEFEncoder()->encode(object,false);
java中的解码就像是,
byte arr = amef encoded byte array value;
AMEFDecoder decoder = new AMEFDecoder()
AMEFObject object1 = AMEFDecoder.decode(arr,true);
协议实现具有C ++和Java的编解码器,有趣的是它可以以名称值对的形式保留对象类表示, 我在上一个项目中需要一个类似的协议,当我偶然发现这个协议时,我实际上根据我的要求修改了基本库。希望这会对你有所帮助。
答案 5 :(得分:1)
普通老ASN.1怎么样?
它的优势在于真正得到标准(并广泛使用)的支持。问题是找到每种语言的编译器/运行时。
答案 6 :(得分:0)
该项目是Java序列化协议的最终比较:
https://github.com/eishay/jvm-serializers/wiki
某些库还提供C ++序列化。 我个人将Python Construct移植到Java。如果有兴趣的话,我很乐意开始转换为C ++和/或JavaScript的转换项目!