二进制序列化协议

时间:2011-06-02 04:20:55

标签: java serialization binary codec

我有一个要求,我需要在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);    

协议应该提供一些维护对象表示状态的中间对象,以便使用反射我可以稍后返回对象。

7 个答案:

答案 0 :(得分:5)

答案 1 :(得分:1)

查看Google的protocol buffers

答案 2 :(得分:1)

Thrift正是您要找的。您只需创建需要调用的结构和方法的定义,它就可以完成所有繁重的任务。它有二进制协议(可选择使用zlib压缩或ssl)。它可能会征税,但你没有听到我的意见。

答案 3 :(得分:1)

您可能想要查看这些项目并选择一个:

  1. Protocol Buffers
  2. Thrift
  3. Apache Avro
  4. Here是我最近阅读的Thrift-vs-PB比较。您还应该参考this Wiki来了解这些库之间的性能比较。

答案 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的转换项目!

  1. http://construct.wikispaces.com/
  2. https://github.com/ZiglioNZ/construct