Почему не каждый тип объекта сериализуем? - PullRequest
10 голосов
/ 21 августа 2009

Почему не каждый тип объекта неявно сериализуем?

В моем ограниченном понимании, объекты не просто хранятся в куче, а указатели на них в стеке?

Разве вы не можете проходить их программно, хранить их в универсальном формате, а также восстанавливать их оттуда?

Ответы [ 6 ]

18 голосов
/ 21 августа 2009

Некоторые объекты инкапсулируют ресурсы, такие как указатели файлов или сетевые сокеты, которые не могут быть десериализованы до состояния, в котором они находились при сериализации объекта, который их содержал.

Пример: вы не должны десериализовать объект, который служит в качестве аутентифицированного подключение к базе данных, потому что для этого, вам нужно сериализованную форму для содержать текстовый пароль. это не будет хорошей практикой, потому что кто-то может овладеть спасенным сериализованная форма. У вас тоже нет Идея, когда вы десериализуете, что сервер базы данных все еще работает, может быть доступным, аутентификация учетные данные еще действительны и т. д.

5 голосов
/ 21 августа 2009

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

Я попытался описать универсальную библиотеку сериализации в c в предыдущем ответе и обнаружил, что есть некоторые сложные случаи.

3 голосов
/ 21 августа 2009

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

1 голос
/ 25 августа 2009

Вы правы в своих предположениях, в некотором смысле.

Должна быть возможность разбить набор всех объектов в программе на группы

1) У вас есть полная информация, которая позволяет выполнить полную реконструкцию и реконструкцию объекта. Массивы чисел или строк, структуры являются хорошими примерами.

2) У вас есть строительная информация. Вы можете восстановить объект, вызвав внешний код. Файл является хорошим примером, но он требует, чтобы ваша программа имела файловую абстракцию, которая запоминает параметры построения и состояния. Мы можем, например, сохранить путь к файлу и позицию в файле. Однако реконструкция может потерпеть неудачу. (Например, файл был удален или изменен)

3) У вас нет информации о конструкции, объект был каким-то образом получен случайным образом.

Здесь, чтобы иметь возможность полностью сериализовать объекты, мы должны перейти от 3) к 2) к 1). Объекты в 3) могут быть атрибутами объекта типа 2) и могут быть получены путем успешного восстановления объекта типа 2).

Однако объект типа 2) должен быть реконструирован путем сериализации только информации о конструкции, которая должна иметь тип 1), например, чисел и строк, истинных данных.

Вся эта схема кажется дорогостоящей, поскольку, если мы хотим восстановить все состояние программы, нам придется работать с абстракциями, которые инкапсулируют объекты типа 2). И мы должны знать, что мы делаем, когда объект не может быть реконструирован. Кроме того, мы должны быть уверены, что мы не смешиваем объекты этих типов, что мы не смешиваем объекты типа 3 или 2, где мы ожидаем собрать только объекты типа 1.

1 голос
/ 21 августа 2009

Какой смысл в сериализации объекта, который содержит сетевое соединение и отвечает за потоковую передачу данных с веб-сервера?

Как насчет десериализации, как это будет работать? Должен ли он снова открыть соединение, загрузить файл заново?

0 голосов
/ 21 августа 2009

Технически, любой объект в области памяти может быть сериализован и сохранен на долговременном носителе, таком как жесткий диск. В конце концов, большинство операционных систем загружают активную память на диск и с диска, и многие из них также имеют функцию стиля гибернации. Например, проблема заключается в области видимости: вы создаете строковый объект в своем пространстве памяти, который вы можете сериализовать и десериализовать по своему усмотрению. Когда вы открываете файл, ОС предоставляет вам дескриптор файла, но ОС все еще владеет файловой системой, содержащей фактический объект файла, к которому у вас есть дескриптор. С другой стороны, драйвер файловой системы должен поддерживать постоянную базу данных файловых дескрипторов и других метаданных, связанных с файлами.

...