二进制序列化协议

3
我有一个需求,需要在两个应用程序之间通过电线(TCP二进制)传输信息。其中一个是Java,另一个是C++。我需要一种协议实现来在这两个应用程序之间传输对象。对象类存在于两个应用程序中(已相应映射)。我只需要在一侧使用一些编码方案来保留对象表示,并可以在另一侧解码为完整的对象。
例如,
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);    

该协议应该提供一些中间对象,以维护对象的表示状态,这样使用反射技术后我可以稍后取回该对象。
7个回答


1
你可以查看amef协议,C++编码在amef中的示例如下:
    //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的编解码器,有趣的部分是它可以通过名称值对形式保留对象类表示, 在我的上一个项目中,我需要一个类似的协议,当我偶然发现这个协议时,我实际上根据我的要求修改了基础库。希望这能帮到你。

1

1

Thrift 是你要找的。你只需要创建一个结构体和方法的定义,然后它就会完成所有繁重的工作。它具有二进制协议(可选使用zlib压缩或ssl)。它可能还能帮你报税,但这不是我说的。


1

1

那么普通的 ASN.1 呢?

它有一个优点,就是真正由标准支持(并且被广泛使用)。问题在于找到每种语言的编译器/运行时。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接