Десериализация требует кастинга? - PullRequest
1 голос
/ 22 апреля 2009

Я читал эту статью, где у них есть этот код:

// Serialization
XmlSerializer s = new XmlSerializer( typeof( ShoppingList ) );
TextWriter w = new StreamWriter( @"c:\list.xml" );
s.Serialize( w, myList );
w.Close();

// Deserialization
ShoppingList newList;
TextReader r = new StreamReader( "list.xml" );
newList = (ShoppingList)s.Deserialize( r );

Последняя строка - оператор приведения? Если так, разве это не ухудшает производительность сериализации?

Ответы [ 5 ]

6 голосов
/ 22 апреля 2009

Да, последняя строка является оператором приведения. У кастинга есть стоимость, связанная с этим, но она незначительна по сравнению со стоимостью сериализации. Я сомневаюсь, что это даже появилось бы на профилировщике.

Подумайте, что включает в себя сериализация.

  • Обработка потока байтов
  • Создание типов на основе информации метаданных
  • Преобразование между байтовыми массивами и типами данных

Любая из этих операций значительно дороже одной операции приведения.

РЕДАКТИРОВАТЬ Относительно того, почему вообще требуется литье.

Здесь есть несколько причин. Во-первых, API десериализации не имеют возможности узнать, какой тип потока байтов, прежде чем он его осмотрит. Таким образом, единственный выбор, который API имеет с точки зрения типа возврата в метаданных, - это Object.

Во-вторых, десериализация должна поддерживать буквально любой сериализуемый тип. Для функционирования он должен выбрать тип возврата для метода, который применим ко всем типам, которые могут быть сериализованы. Единственный доступный тип, который соответствует этому объекту.

3 голосов
/ 22 апреля 2009

Броски очень дешевы по сравнению с самой стоимостью десериализации. Процесс десериализации довольно сложный - один (рабочий) актерский состав вряд ли займет какое-то время.

Конечно, если вы заинтересованы в быстрой, переносимой, компактной сериализации с хорошей историей управления версиями, вам следует обратить внимание на Protocol Buffers:

(Существуют и другие платформы сериализации, такие как Thrift .)

1 голос
/ 22 апреля 2009

Метод Deserialize () возвращает объект и должен быть «приведен» к правильному типу.

Приведение в первую очередь говорит компилятору, что вы знаете тип объекта, поскольку компилятор не может определить его тип. Среда выполнения по-прежнему будет генерировать исключение InvalidCast, если тип не соответствует указанному вами (или подтипу указанного типа).

Фактическая стоимость литья минимальна.

0 голосов
/ 22 апреля 2009

Если вы измените эту последнюю строку кода

newList = (ShoppingList)s.Deserialize( r );

до

newList = s.Deserialize( r );

Компилятор добавит обратно в приведение. Я только что подтвердил это с помощью .NET Reflector от Red Gate. Поэтому, независимо от стоимости приведения, вы обязаны это делать, если хотите использовать этот типизированный объект.

0 голосов
/ 22 апреля 2009

Десериализация возвращает тип Object, поэтому приведение должно привести его к правильному классу.

Независимо от того, окажет ли это какое-либо влияние на десериализацию или нет, вы хотите, чтобы оно было частью ShoppingList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...