Почему сериализация, когда объект класса в памяти уже двоичный (C / C ++)? - PullRequest
8 голосов
/ 13 декабря 2011

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

Ответы [ 5 ]

10 голосов
/ 13 декабря 2011

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


Даже объект, который состоит только из нативных типов, может вызывать проблемы при совместном использовании между двумя системами из-за дополнительных дополнений, которые могут существовать между и после членов, среди прочего. Совместное использование необработанных дампов памяти объектов между программами, скомпилированными для одной и той же архитектуры, но с разными версиями компилятора, также может стать большой проблемой. Нет никакой гарантии, как тип переменной T действительно хранится в памяти.


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

Я слышал, как разработчики говорили о ntohl / htonl / ntohl / ntohs как о методах сериализации / десериализации целых чисел, и когда вы думаете об этом, говорите, что это не так уж далеко от истины.


Слово " сериализация " часто используется для описания этого " сложного способа хранения данных общим способом ", но опять же; Ваше первое задание на программирование, в котором вас попросили сохранить информацию о Dogs в файл (возможно, *), каким-либо образом использовало сериализацию.

* «надеюсь», что означает, что вы не выгружали необработанное представление памяти вашего Dog объекта на диск

7 голосов
/ 13 декабря 2011

Pointers!

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

2 голосов
/ 13 декабря 2011

Указатель и пакет данных (выравнивание данных)

Если вы memcpy храните память вашего объекта, опасно копировать значение дикого указателя вместо его данных.Существует еще один риск: если отправитель и получатель используют разные методы пакета данных (выравнивание данных), вы получите мусор после декодирования.

1 голос
/ 13 декабря 2011

Двоичные представления могут быть разными в разных архитектурах, компиляторах и даже в разных версиях одного и того же компилятора. Нет никакой гарантии, что то, что система A воспринимает как целое число со знаком, будет восприниматься как одинаковое в системе B. Порядок следования байтов, длина слова, заполнение структуры и т. Д. Станут трудными для устранения проблем, если вы не определите протокол или формат файла для обмен данными.

0 голосов
/ 13 декабря 2011

Класс (когда мы говорим о C ++) также включает в себя указатели виртуальных методов - и они должны быть восстановлены на принимающей стороне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...