сериализация шаблонов команд в с ++ - PullRequest
3 голосов
/ 08 марта 2011

Я хочу сделать следующее в C ++:

  1. создать объект команды
  2. сериализовать его
  3. (отправить на другой компьютер)
  4. десериализация
  5. выполнить

Два случая:

  • отправитель и получатель оба выигрывают 7 компьютеры
  • отправитель * nix, а получатель выиграл 7

Я нашел учебник по поисковому запросу: http://www.functionx.com/cpp/articles/serialization.htm. Это путь? В Python я мог бы сделать:

def setAndPackCommand(self, object):
    outFile = StringIO.StringIO()
    pickledC = pickle.dump(object, outFile) # this packs object to outFile
    stringToSend = outFile.getvalue() # decoding to string

def unpackAndExecute(self, stringToReceive):
    inFile = StringIO.StringIO()
    inFile.write(stringToReceive)
    inFile.seek(0, 0)
    receivedC = pickle.load(inFile)     
    receivedC.execute()

В этом коде главными пунктами являются pickle.dump и pickle.load. Каковы аналоги C ++? Википедия говорит, что с ++ не поддерживает сериализацию? Какая ссылка выше тогда?

Что означает двоичная сериализация? память выгружается на диск, и для десериализации необходим точно такой же компьютер (без межплатформенной передачи)?

ш, Юха

Ответы [ 3 ]

1 голос
/ 08 марта 2011

Чтобы кратко ответить на ваши вопросы, Википедия права - C ++ не изначально поддерживает сериализацию. Это не означает, что вы не можете использовать собственное решение, как показано в статье, на которую вы ссылались.

Двоичная сериализация относится к записи объекта в двоичный формат файла. В отличие от (например) сериализации XML, где объект записывается в формате на основе XML: в первом случае вы получаете двоичный файл, где (например) int состоит из 4 байтов необработанных двоичных данных. В последнем случае вы можете получить тег int с атрибутом name, а его содержимым будет текстовое значение целого числа, например <int name="myInt">12345</int>.

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

Альтернативы (сериализация на основе текста, сериализация XML и т. Д.) Имеют то преимущество, что обычно они более кроссплатформенные и их легче редактировать вручную, но, как правило, менее компактны, чем двоичный подход.

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

1 голос
/ 08 марта 2011

Я бы также рекомендовал использовать стабильную библиотеку типа boost.serialization для сериализации данных.

Если вы новичок в сериализации, это означает преобразование объектов в представление данных, подходящее для передачи или хранения, и перестройку их из этого представления данных. Сложность не так велика с так называемыми POD (обычными объектами старых данных) . Вы можете передать буфер как данные и привести его обратно после передачи, позаботившись о выравнивании данных и упорядочении байтов (порядковый номер). Это становится более сложным, если объекты ссылаются на другие объекты, и тогда имеет смысл использовать хорошо разработанную библиотеку. Сериализация Boost также поддерживает версионирование, поэтому вы можете обновлять свой формат и поддерживать совместимые читатели и писатели с обратной совместимостью (конечно, с некоторыми усилиями)

Вот хорошее введение.

0 голосов
/ 08 марта 2011

Конечно, программа C ++ может выполнять сериализацию, но не из коробки.Проверьте библиотеку Boost.Serialization или буферы протокола Google .Последний реализует быструю и переносимую кроссплатформенную (двоичную) сериализацию, но требует использования генератора кода.

(Учебник, на который вы ссылаетесь, демонстрирует очень упрощенный, непереносимый подход к сериализации.хорошо, как не для обработки строк в C ++.)

...