Объекты в вашей программе имеют четко определенную структуру памяти, наложенную вашим компилятором. Но эта компоновка не будет точно такой же в другой программе, запущенной на другой машине, скомпилированной другим компилятором. И он обычно не очень совместим с транспортной средой, такой как сетевое соединение или файл. О котором вам нужно позаботиться, чтобы доставить объект с одной машины на другую.
Файлы и сетевые пакеты - это простые потоки байтов. Вот где сериализация вступает в игру, вам нужно сериализовать объект в памяти в поток байтов. И его необходимо десериализовать на принимающей стороне обратно из потока байтов в объект.
Очевидный способ сделать это - двоичная сериализация. Вы берете байты для каждого поля в объекте и записываете их в поток. Очень эффективно, но и очень хлопотно. Первая проблема, с которой вы сталкиваетесь, заключается в том, что принимающая сторона имеет другое представление о том, как выглядит объект. Он может быть скомпилирован с другой версией объявления объекта, например, с добавленным полем. Проблема острее, когда объект обменивается между различными машинами. У них может быть совершенно другое представление о количестве байтов в целом числе. Или порядок байтов (порядковый номер).
Было много решений этой проблемы. Они обычно включают в себя какие-то метаданные, которые описывают поля в объекте. Появление Unicode позволило поместить как метаданные, так и значения полей в текстовое описание, лучшим примером этого является XML.