2010-02-04 3 views
0

Я хочу знать, как работает десериализация, и действительно ли нужно иметь сборку в этой системе, где происходит десериализация.Может ли кто-нибудь объяснить мне внутренности десериализации?

+2

От XML или Binary? Как ни странно, они действуют совершенно по-другому. Лучший вопрос: зачем вам нужна сборка? Если вы переходите к не-.NET, то вам лучше всего будет сериализовать XML (или какой-то другой формат сериализации обычного текста). В этом случае вам не нужно знать внутренние элементы 'XmlSerializer'.Если вы используете связь .NET с .NET, тогда лучше всего позволить инфраструктуре обрабатывать все для вас. –

+0

Первый ответ - двоичный. Actaully im спрашивает об этом только из-за моей странности, как то, как происходит Deserialization. Более того, когда происходит сериализация, какая информация, кроме объекта, становится сериализованной. – Amit

ответ

1

Если вы еще не посмотрели MSDN, сделайте это. Он расскажет вам все, что вам нужно знать о процессе сериализации/десериализации ... по крайней мере, достаточно, чтобы использовать его. Ссылка, которую я вам дал, это конкретно «как десериализовать».

Что касается более технических аспектов, то части информации, которые будут сериализованы, будут именно тем, что требуется для заполнения этой структуры/класса/объекта.

Я не совсем уверен, что вы подразумеваете под второй частью своего вопроса о сборке. Однако, если вы сериализуете структуру (например), то для десериализации на другую машину или приложение вы должны иметь такую ​​же доступную структуру: имя, поля, типы данных и т. Д.

0

Если вы хотите, ищите точные данные, вы можете загрузить экземпляр Reflector и указать его на mscorlib и изучить различные классы в пространстве имен System.Runtime.Serialization. Вот идея высокого уровня (как я понимаю):

Первый шаг - гарантировать, что система типов, которая пишет двоичный поток, такая же, как система типов, которая считывает двоичный поток. Поскольку к выходу добавляется так мало метаинформации, проблемы могут возникать, если мы не смотрим на один и тот же тип. Если у нас есть два класса с именем A, но автор считает Aclass A { int m_a, m_b; }, и читатель считает, что A - class A { int m_b, m_a; }, у нас будут проблемы. Эта проблема намного хуже, если типы существенно различаются. Имейте это в виду, он вернется позже.

Хорошо, поэтому мы читаем и пишем те же типы. Следующий шаг - найти всех членов объекта, который вы хотите сериализовать. Вы могли бы сделать это путем отражения с помощью вызова, например, typeof(T).GetFields(~System.Reflection.BindingFlags.Default), но это будет очень медленно (эмпирическое правило: отражение slow). К счастью, внутренние вызовы .NET намного быстрее.

Шаг 1: Теперь мы добираемся до письма. Во-первых: писатель пишет strong-name assembly, что объект, который мы сериализуем, находится внутри. Затем читатель может подтвердить, что на самом деле эта сборка загружена. Затем записывается тип класса с пространством имен объекта, поэтому читатель может считывать соответствующий объект. Это в основном гарантирует, что тип чтения и тип записи одинаковы.

Шаг 2: Время на самом деле написать объект. Взгляд на методы Formatter позволяет нам знать, что есть некоторые основные функции для написания int s, float и всевозможные простые типы. В заранее определенном порядке (порядок, который они объявляют, начиная с полей базового класса), каждое поле записывается на выход. Для полей, которые не являются простыми типами, возвращайтесь к шагу 1 с объектом в этом поле.

Для десериализации вы выполняете эти же шаги, за исключением замены всех глаголов, таких как «писать» глаголами типа «читать». Заказ чрезвычайно важен.

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