почему мы не можем сериализовать эти объекты? - PullRequest
0 голосов
/ 23 августа 2009

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

"" C # не предоставляет средства для получения размера объекта во время выполнения. Это означает, что, если мы сериализуем класс, мы не сможем гарантировать размер записи фиксированной длины "" (из книги, в которой я читал).

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

Ответы [ 2 ]

2 голосов
/ 23 августа 2009

Любой объект, помеченный атрибутом SerializableAttribute, может быть сериализован (в большинстве сценариев). Результат от сериализации всегда направляется в поток, который вполне может быть потоком вывода файла.

Вы спрашиваете, почему граф объектов не может быть частично десериализован? Только сериализация .NET [де] сериализует полные графы объектов. В противном случае вам придется обратиться к другим форматерам сериализации или написать свой собственный.

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

EDIT:

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

Для сохранения данных в других структурах; сделайте это в два этапа: во-первых, направьте байты сериализации на [т.е. поддерживаемый памятью] поток, из которого вы можете впоследствии прочитать размер, а затем записать данные в фактическое резервное хранилище, используя указанное знание размера.

Вы не можете предсказать размер сериализованного объекта, потому что сериализованное представление может сильно отличаться от представления во время выполнения.

Это все еще позволяет добиться точного контроля над размером вывода, если вы используете только примитивные типы и пишете с использованием BinaryWriter - но это не само сериализация.

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

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

Чтобы иметь возможность произвольного доступа к любой записи в файле, напишите собственную реализацию двоичной сериализации вашего класса или используйте базу данных. Если вам нужен простой, не устанавливаемый однопоточный движок базы данных, обратите внимание на SQL Server Compact .

...