Это хорошая концепция для отправки сериализованных объектов по сети? - PullRequest
0 голосов
/ 12 октября 2010
  • У меня есть клиент и сервер
  • Я хочу отправлять объекты от клиента к серверу
  • Объекты должны отправляться вместе в «большом пакете», содержащем много объектов
  • Объекты могут быть в произвольном порядке
  • Число объектов не фиксировано
  • В пакете могут быть объекты, которые неизвестны серверу (поэтому ему нужночтобы выбросить их)

У меня нет большого опыта работы с сериализацией.Я бы предпочел Boost Serialization-framework (если это возможно с ним), я подумал о следующей концепции(неполный псевдокод, основанный на C ++, без специального Boost :: Serialization-code):

class SerializableObject
{
    virtual int getIdentifier() =0;
    virtual Archive serialize() =0;
}
class SubclassA : public SerializableObject
{
    int getIdentifier() { return 1; }
    Archive serialize() { ... }
    ...
}
class SubclassB : public SerializableObject
{
    int getIdentifier() { return 2; }
    Archive serialize() { ... }
    ...
}

Сейчас на стороне клиента:

void packAndSendData()
{
    archive << objectA.getIdentifier();
    archive << objectA;
    archive << objectB.getIdentifier();
    archive << objectB;
    myNetworkObject.sendData(archive);
}

На стороне сервера:

void receiveAndUnpackData()
{
    archive = myNetworkObject.receiveData();

    while(archive.containsObjects()) //possible?
    {
        int type = archive.deserializeNextObject();
        if(type == 1)
            SubclassA objectA = archive.deserializeNextObject();
        if(type == 2)
            SubclassB objectB = archive.deserializeNextObject();
        else
            archive.dropNextObject(); //How to do this? Possible?
    }
}

Итак, вопросы:
- Это хорошая концепция или есть другие возможности?
- Возможна ли такая концепция с Boost :: Serialization
- Если нет: Существуют ли другие библиотеки, которые могли бы помочьреализовать концепцию?

Я пытался максимально сжать проблему и дать как можно больше информации.Надеюсь, понятно, что я имел в виду и чего я пытаюсь достичь.Если у кого-то есть лучший заголовок для этого вопроса, пожалуйста, исправьте существующий, я понятия не имел, как описать этот вопрос со всеми его аспектами.

Ответы [ 2 ]

1 голос
/ 12 октября 2010

Подход, который вы описываете, является началом, но задумывались ли вы о том, как сериализовать ссылки между объектами.Т.е. сериализация объекта графа.Кроме того, если вам нужно подумать о версиях формата данных, если ваш клиент и сервер могут меняться синхронно друг с другом.Это не обязательно простая проблема.

Существуют ли другие библиотеки, которые могут помочь в реализации концепции?

Вы можете посмотреть на проект Google Protocol Buffers .Он, вероятно, делает то, что вы хотите, и не зависит от языка.

0 голосов
/ 12 октября 2010

Сериализация Boost - определенно начало, однако есть и другие соображения, такие как

  1. Фрагментация - то есть, что происходит, если «коллекция» ваших объектов не может вписаться в один пакет, как вы узнаете на другом конце, что вы получили все данные, которые представляют «коллекцию»
  2. Платформы - если у вас однородная среда (скажем, все linux), это не проблема, но если у вас есть смесь, это может быть проблемой (я не верю, что расширенная сериализация работает для разных байтовых кодировок - я здесь может быть что-то не так, нужно проверять документы) Это относится и к языкам (вопрос, поднятый Энди Джонсоном выше) - при ускоренной сериализации вы привязаны к C ++.

Я бы порекомендовал вам взглянуть на один из продуктов обмена сообщениями в ОС, и особенно, если вы хотите отправлять структуры, что-то вроде Open DDS. Все сериализации и т. Д. Обрабатываются хорошо для вас, и вы получаете гораздо больше функций и возможностей. Конечно, это довольно тяжелый вес и чуть менее производительный, чем сериализация asio +, но вам придется выполнять меньше работы.

...