В дополнение к тому, что сказали другие ответы:
Иногда вы хотите сериализовать вещи, которые не являются чистыми данными.
Например, подумайте о дескрипторе файла или соединении с сервером. Даже если дескриптор файла или сокета является int
, это число не имеет смысла при следующем запуске программы. Чтобы правильно воссоздать объекты, которые содержат дескрипторы таких вещей, вам нужно заново открыть файлы и воссоздать соединения, и решить, что делать, если это не удастся.
Многие языки в наши дни поддерживают хранение анонимных функций внутри объектов, например, onBlah()
обработчик в Javascript. Это сложно, потому что такой код может содержать ссылки на дополнительные фрагменты данных, которые, в свою очередь, должны быть сериализованы. (И еще есть проблема сериализации кода кросс-платформенным способом, который, очевидно, проще для интерпретируемых языков.) Тем не менее, даже если поддерживается только подмножество языка, он все равно может оказаться весьма полезным. Не многие механизмы сериализации пытаются сериализовать код, но смотрите serialize-javascript .
В тех случаях, когда вы хотите сериализовать объект, но он содержит что-то, что не поддерживается вашим механизмом сериализации, вам нужно переписать код так, чтобы обойти это. Например, вы можете использовать перечисления вместо анонимных функций, когда существует конечное число возможных функций.
Часто вы хотите, чтобы сериализованные данные были краткими.
Если вы отправляете данные по сети или даже храните их на диске, важно сохранить небольшой размер. Один из самых простых способов добиться этого - выбросить информацию, которую можно восстановить (например, отбросить кеши, хеш-таблицы и альтернативные представления тех же данных).
Конечно, программист должен вручную выбрать то, что должно быть сохранено и то, что должно быть отброшено, и убедиться, что вещи восстанавливаются при воссоздании объекта.
Подумайте об акте спасения игры. Объекты могут содержать множество указателей на графические данные, звуковые данные и другие объекты. Но большая часть этого материала может быть загружена из файлов данных игры и не нуждается в сохранении в файле сохранения. Отказ от этого может быть трудоемким, поэтому часто остаются мелочи. Я отредактировал некоторые файлы сохранения в свое время и обнаружил данные, которые явно были избыточными, например текстовые описания элементов.
Иногда пространство не важно, но удобочитаемость - в этом случае вы можете использовать формат ASCII (возможно, JSON или XML).