2016-01-29 2 views
0

Ну, несколько версий позже, ключ в словаре изменился с int на long. Теперь при десериализации старого графа объектов метод Deserialize прерывается с помощью ArgumentException и исключение «Объект типа XX не может быть преобразован в тип YY».Deserializing Dictionary с .Net BinaryFormatter

Полное исключение:

Объект типа 'System.Collections.Generic.Dictionary`2 [System.Int32, System.Collections.Generic.List`1 [XX]]' не может преобразуется в тип 'System.Collections.Generic.Dictionary`2 [System.Int64, System.Collections.Generic.List`1 [XX]]'.

Стоит отметить, что я использую класс SerializationBinder для обработки изменений типа во время выпуска.

Любая помощь, как справиться с этой ошибкой?

+2

Вот почему не рекомендуется использовать 'BinaryFormatter' для сохраняемых данных. Я не знаю, как это исправить, поэтому я никогда не использую его для данных, которые сохраняются или передаются между машинами. Пожалуйста, укажите, что вы сделали в своем «SerializationBinder», если хотите помочь его исправить. –

+0

Попробуйте BinarySerializer от nuget – Jeff

+0

@Scott, в методе SerializationBinder :: BindToType, я просто переназначаю старые имена типов для новых, тех, кто изменил, переименовал и т. Д. Ничего особенного. –

ответ

0

«Правильное» исправление (при условии, что у вас нет других устаревших систем, обращающихся к этим данным) будет «десериализация» всех сохраненных данных в объект Dictionary<int,List>, а затем копирование каждого из этих элементов в объект Dictionary<long,List> , затем сериализуя словарь Int64 обратно на носитель данных.

Это обеспечит немедленное устранение проблемы без необходимости менять код, но может быть ресурсоемким, в зависимости от того, сколько данных вы имеете в виду.

+0

@ Майк, Ну, это очень ОГРОМНОЕ приложение с множеством типов. Глубина графа объекта составляет около 6, и каждый уровень содержит много типов. Это исключение происходит только для одного из них, поэтому исправление может быть невозможно. –

+0

Я боялся этого. Я не знаю другого способа, после использования двоичной сериализации. –

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