1

Если у вас есть экземпляр объекта A, который ссылается на другие объекты (например, экземпляры B и C), а вы двоичный сериализуете A в файл, что происходит? У вас теперь есть сериализованные данные, содержащие A, B и C?.NET Binary Serialize объект со ссылками на другие объекты. , , что происходит?

Как это работает? Что я получу, если я десериализую данные? A, B и C ??

(Не стесняйтесь также включать внутренние объяснения работы).

ответ

6

Все ссылки на другие объекты также будут сериализованы. Если вы десериализуете данные, вы получите полный рабочий набор своих данных, включая объекты A, B и C. Это, вероятно, основное преимущество двоичной сериализации, в отличие от сериализации XML.

Если какой-либо из других классов, на которые ссылается ваш объект, не отмечен [Serializable] attribute, вы получите SerializationException во время выполнения (изображение которого было бесстыдно украдено из Интернета, ошибки времени выполнения «т даже выглядеть больше в текущих версиях VS):

        Example of an unhandled SerializationException

кроме того, я не уверен, что„внутренние дела“вы надеялись понять. Сериализация использует reflection для прохождения через публичные и частные поля объектов, преобразуя их в поток байтов, которые в конечном итоге записываются в поток данных. Во время десериализации происходит обратное: поток байтов считывается из потока данных, который используется для синтеза точной репликации объекта вместе с информацией о типе. Все поля в объекте имеют те же значения, что и раньше; конструктор не, вызываемый при десериализации объекта. Самый простой способ подумать о том, что вы просто делаете снимок на месте объекта, который можно восстановить по своему первоначальному состоянию по желанию.

Класс, который отвечает за фактическую сериализацию и десериализацию, называется форматированием (он всегда наследуется от IFormatter interface). Задача состоит в создании «графа объектов», который представляет собой обобщенное дерево, содержащее объект, который сериализуется/десериализован как его корень. Как упоминалось выше, форматирующий элемент использует отражение для прохождения через этот объектный граф, сериализуя/десериализуя все ссылки на объекты, содержащиеся в этом объекте. Форматирование также достаточно интеллектуально, чтобы знать, чтобы не сериализовать какой-либо объект на графике более одного раза. Если две ссылки на объекты фактически указывают на один и тот же объект, это будет обнаружено и этот объект будет только сериализован один раз.Эта и другая логика предотвращают ввод бесконечного цикла.

Конечно, легко понять, как этот процесс работает. Это много сложнее написать код, который реализует его самостоятельно. К счастью, это уже сделано для вас. Часть точки .NET Framework заключается в том, что вся эта сложная логика сериализации встроена, что позволяет вам не беспокоиться об этом. Я не утверждаю, что сам все это понимаю, и вам, конечно же, не нужно либо полностью использовать функциональность, которую он предлагает. Годы написания всего этого кода вручную завершены. Вы должны радоваться, а не беспокоиться о деталях реализации. :-)

+0

Спасибо Коди, именно то, что я искал. Причина, по которой я прошу о взаимных действиях вещей, заключается в том, что я действительно не понимаю и получаю «ах-ха», если не буду. Я должен визуализировать все, чтобы получить его, и запомнить его. Еще раз спасибо за отличный ответ. – richard

+0

@ Рихард: Конечно. Я понимаю, как это происходит, потому что я почти такой же, как и я. Я не столько пытался понять, что вы не должны пытаться это понять. Скорее, «это становится невероятно сложным отсюда», и что немного дополнительных знаний не стоит понимать, чтобы оценить, как это работает. В любом случае, пожалуйста. –

1

Объекты, на которые ссылается основной объект, должны быть [Serializable]. Таким образом, все делается автоматически с помощью форматирования.

+0

... «все сделано». Мой вопрос касается этой части, что такое «все», что сделано? LOL – richard

+2

@ Рихард: Он означает, что все ссылки на другие объекты также будут сериализованы. Если вы выполните десериализацию данных, вы получите полный рабочий набор данных, включая A, B и C. Это, вероятно, является основным преимуществом * двоичной * сериализации. Если эти другие классы не отмечены '[Serializable]', вы получите исключение. –

+0

@ Коды: ответ плюс ваш комментарий дал мне ответ. Благодаря! – richard

4

Во-первых, тип объекта A должен быть помечен атрибутом [Serializable]. Сериализация A будет сериализовать все его данные-члены, частные или общедоступные, если типы участников также будут помечены [Serializable] (или использовать ваш пример при условии, что типы B и C отмечены [Serializable]). Попытки сериализации данных, прямо или косвенно, типа, который не является [Serializable], приведут к исключению.

ряд встроенных в .NET типов уже помечены как [Serializable], в том числе System.Int32 (INT), System.Boolean (BOOL) и т.д.

Вы можете прочитать больше о .NET сериализация здесь: http://msdn.microsoft.com/en-us/library/4abbf6k0.aspx.

Смежные вопросы