![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Vladimir_Petrov |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 7.1.2007 Репутация: нет Всего: нет |
Плохо, когда меняются условия проекта после внедрения программы :( Но деваться некуда.
В связи с этим возникла проблема. Если есть мысли какие, направьте на путь поиска пожалуйста. Ранее были сериализованы объекты в файлы. Теперь нужно загрузить их, но присвоить им другой тип. Объясню на примере.
Один класс
Второй класс (название такое же MyClass1, но другая сборка проекта)
Оба класса в своих dll Отличаются только внутренностями одной функции, остальные функции и типы одинаковые Далее был создан объект первого типа, и сохранен в файл (сериализован) Теперь нужно загрузить объект из файла и сделать его другого типа (из другой сборки) Пробовал вручную в файле сериализованном заменить название сборки, но при загрузке выдается исключение System.Runtime.Serialization.SerializationException: Недопустимый двоичный формат входного потока. Начало содержимого (в байтах): 20-01-20-20-20-FF-FF-FF-FF-01-20-20-20-20-20-20-20 ... в System.Runtime.Serialization.Formatters.Binary.SerializationHeaderRecord.Read(__BinaryParser input) в System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadSerializationHeaderRecord() в .... пробовал другой прием
Возникает исключение {"Объект должен реализовывать интерфейс IConvertible."} Классы большие, со сложной иерархией. Переприсваивать поля вручную очень не хотелось бы, чувствую, должно быть более простое решение. находил другой прием
Но проблема в том, что классы имеют одинаковые названия, и подгружаются динамически из Dll |
||||||||||
|
|||||||||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
Вы использовали BinaryFormatter ? Тогда у него есть Binder если я не ошибаюсь - можно порыть в его сторону.
А можно загружать в старый формат и используя Automapper или подобное преобразовывать на новые классы. А вообще кто вас надоумил хранить в таком формате файлы?) -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
Stolzen |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: нет Всего: 48 |
Попробуйте для старых файлов использовать адаптер. Т.е. оборачивать старые объекты в новые интерфейсы.
|
|||
|
||||
Vladimir_Petrov |
|
|||
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 7.1.2007 Репутация: нет Всего: нет |
Спасибо за советы. Получилось загрузить объект типом из новой сборки с помощью двух путей: 1) CopyObjectData через Reflection (написал рекурсивную функцию копирования объекта любой структуры) 2) Binder - простой способ Возникла другая проблема в обоих случаях. Пытаюсь сериализовать объект, который конвертировал (казалось бы, уже в новый формат), он сохраняется. В файле нет ни слова о старой сборке. Но после загрузки, опять фигурирует старая сборка, и он загружается по-старому. Я не понимаю, как это возможно. Может как то кеширует. |
|||
|
||||
Vladimir_Petrov |
|
|||
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 7.1.2007 Репутация: нет Всего: нет |
Прошу прощения, был мой касяк, запутался в файлах. Сохраняю в один, загружаю с другого....
Проблему с переносом объекта на другую сборку решил (писал выше)
А как еще можно хранить информацию сложно структурированного объекта, кроме как сериализовать его? большие файлы очень неудобно сериализовать. |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
ну например используйте формат не привязанный к платформе (json, xml, bson или какой-нибудь google protobuf) ... -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |