Протокол двоичной сериализации - PullRequest
3 голосов
/ 02 июня 2011

У меня есть требование, где мне нужно передавать информацию по проводам (двоичный по TCP) между 2 приложениями.Один в Java, а другой в C ++.Мне нужна реализация протокола для передачи объектов между этими двумя приложениями.Классы 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 ]

5 голосов
/ 02 июня 2011

Похоже, что вы хотите Protobufs: http://code.google.com/apis/protocolbuffers/docs/tutorials.html

1 голос
/ 02 июня 2011

А как насчет старого? ASN.1 ?

Преимущество в том, что он действительно поддерживается стандартом (и широко используется). Проблема заключается в поиске компилятора / среды выполнения для каждого языка.

1 голос
/ 02 июня 2011

Вы можете проверить протокол 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 голос
/ 02 июня 2011

Вы можете проверить эти проекты и выбрать один из них:

  1. Буферы протокола
  2. Экономия
  3. Apache Avro

Здесь - сравнение Thrift-vs-PB, которое я недавно читал. Вам также следует обратиться к этой вики для сравнения производительности между этими библиотеками.

1 голос
/ 02 июня 2011

Экономия - это то, что вы ищете. Вы просто создаете определение структур и методов, которые вам нужно вызывать, и это делает всю тяжелую работу. У него есть двоичные протоколы (опционально со сжатием zlib или ssl). Вероятно, это пойдет на ваши налоги, но вы не слышали этого от меня.

1 голос
/ 02 июня 2011

Проверьте буферы протокола Google .

0 голосов
/ 05 апреля 2012

Этот проект представляет собой окончательное сравнение протоколов сериализации 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
...