Все ссылки на другие объекты также будут сериализованы. Если вы десериализуете данные, вы получите полный рабочий набор их данных, включая объекты A, B и C Вероятно, это основное преимущество двоичной сериализации, а не XML-сериализации.
Если любой из других классов, на которые ссылается ваш объект, не помечен атрибутом [Serializable]
, вы получите SerializationException
во время выполнения ( изображение которого было бесстыдно украдено из Интернета; ошибки времени выполнения даже не выглядят так в текущих версиях VS):
Кроме того, я не совсем уверен, какие "внутренние вещи" вы надеялись понять. Сериализация использует отражение для обхода открытых и закрытых полей объектов, превращая их в поток байтов, которые в конечном итоге записываются в поток данных. Во время десериализации происходит обратное: поток байтов считывается из потока данных, который используется для синтеза точной копии объекта вместе с информацией о типе. Все поля в объекте имеют те же значения, что и раньше; конструктор не вызывается при десериализации объекта. Самый простой способ думать об этом - просто взять 1010 * снимок на месте объекта, который вы можете восстановить в исходное состояние по желанию.
Класс, отвечающий за фактическую сериализацию и десериализацию, называется форматером (он всегда наследуется от IFormatter
интерфейса ). Его задача - создать «граф объектов», который представляет собой обобщенное дерево, содержащее объект, сериализуемый / десериализованный как его корень. Как упомянуто выше, средство форматирования использует отражение, чтобы пройти через этот граф объектов, сериализовав / десериализовав все ссылки на объекты, содержащиеся в этом объекте. Форматировщик также достаточно умен, чтобы знать, что сериализовать какой-либо объект в графе не нужно более одного раза. Если две ссылки на объект фактически указывают на один и тот же объект, это будет обнаружено, и этот объект будет сериализован только один раз. Эта и другая логика не позволяют войти в бесконечный цикл.
Конечно, легко понять, как работает этот процесс. На самом деле намного сложнее написать код, который реализует его самостоятельно. К счастью, это уже сделано для вас. Отчасти .NET Framework заключается в том, что вся эта сложная логика сериализации встроена, что избавляет вас от беспокойства об этом. Я не претендую на то, что понимаю все это сам, и вам, конечно, не нужно ни использовать все возможности, которые он предлагает. Годы написания всего этого кода вручную окончены. Вы должны радоваться, а не беспокоиться о деталях реализации. : -)