Все ссылки на другие объекты также будут сериализованы. Если вы десериализуете данные, вы получите полный рабочий набор своих данных, включая объекты A, B и C. Это, вероятно, основное преимущество двоичной сериализации, в отличие от сериализации XML.
Если какой-либо из других классов, на которые ссылается ваш объект, не отмечен [Serializable]
attribute, вы получите SerializationException
во время выполнения (изображение которого было бесстыдно украдено из Интернета, ошибки времени выполнения «т даже выглядеть больше в текущих версиях VS):
кроме того, я не уверен, что„внутренние дела“вы надеялись понять. Сериализация использует reflection для прохождения через публичные и частные поля объектов, преобразуя их в поток байтов, которые в конечном итоге записываются в поток данных. Во время десериализации происходит обратное: поток байтов считывается из потока данных, который используется для синтеза точной репликации объекта вместе с информацией о типе. Все поля в объекте имеют те же значения, что и раньше; конструктор не, вызываемый при десериализации объекта. Самый простой способ подумать о том, что вы просто делаете снимок на месте объекта, который можно восстановить по своему первоначальному состоянию по желанию.
Класс, который отвечает за фактическую сериализацию и десериализацию, называется форматированием (он всегда наследуется от IFormatter
interface). Задача состоит в создании «графа объектов», который представляет собой обобщенное дерево, содержащее объект, который сериализуется/десериализован как его корень. Как упоминалось выше, форматирующий элемент использует отражение для прохождения через этот объектный граф, сериализуя/десериализуя все ссылки на объекты, содержащиеся в этом объекте. Форматирование также достаточно интеллектуально, чтобы знать, чтобы не сериализовать какой-либо объект на графике более одного раза. Если две ссылки на объекты фактически указывают на один и тот же объект, это будет обнаружено и этот объект будет только сериализован один раз.Эта и другая логика предотвращают ввод бесконечного цикла.
Конечно, легко понять, как этот процесс работает. Это много сложнее написать код, который реализует его самостоятельно. К счастью, это уже сделано для вас. Часть точки .NET Framework заключается в том, что вся эта сложная логика сериализации встроена, что позволяет вам не беспокоиться об этом. Я не утверждаю, что сам все это понимаю, и вам, конечно же, не нужно либо полностью использовать функциональность, которую он предлагает. Годы написания всего этого кода вручную завершены. Вы должны радоваться, а не беспокоиться о деталях реализации. :-)
Спасибо Коди, именно то, что я искал. Причина, по которой я прошу о взаимных действиях вещей, заключается в том, что я действительно не понимаю и получаю «ах-ха», если не буду. Я должен визуализировать все, чтобы получить его, и запомнить его. Еще раз спасибо за отличный ответ. – richard
@ Рихард: Конечно. Я понимаю, как это происходит, потому что я почти такой же, как и я. Я не столько пытался понять, что вы не должны пытаться это понять. Скорее, «это становится невероятно сложным отсюда», и что немного дополнительных знаний не стоит понимать, чтобы оценить, как это работает. В любом случае, пожалуйста. –