Любой объект, помеченный атрибутом SerializableAttribute
, может быть сериализован (в большинстве сценариев). Результат от сериализации всегда направляется в поток, который вполне может быть потоком вывода файла.
Вы спрашиваете, почему граф объектов не может быть частично десериализован? Только сериализация .NET [де] сериализует полные графы объектов. В противном случае вам придется обратиться к другим форматерам сериализации или написать свой собственный.
Для прямого произвольного доступа к файлу необходимо открыть файл с потоком, поддерживающим поиск.
EDIT:
Поиск в результирующем потоке из сериализации не имеет практической цели - только форматировщик сериализации знает, что там, в любом случае, и всегда должен подаваться в самом начале потока.
Для сохранения данных в других структурах; сделайте это в два этапа: во-первых, направьте байты сериализации на [т.е. поддерживаемый памятью] поток, из которого вы можете впоследствии прочитать размер, а затем записать данные в фактическое резервное хранилище, используя указанное знание размера.
Вы не можете предсказать размер сериализованного объекта, потому что сериализованное представление может сильно отличаться от представления во время выполнения.
Это все еще позволяет добиться точного контроля над размером вывода, если вы используете только примитивные типы и пишете с использованием BinaryWriter - но это не само сериализация.