Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> изменить тип у объекта программно, Сменилос имя сборки у сериализуемого obj 
:(
    Опции темы
Vladimir_Petrov
Дата 13.11.2011, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 7.1.2007

Репутация: нет
Всего: нет



Плохо, когда меняются условия проекта после внедрения программы :( Но деваться некуда.
В связи с этим возникла проблема. Если есть мысли какие, направьте на путь поиска пожалуйста.
Ранее были сериализованы объекты в файлы. Теперь нужно загрузить их, но присвоить им другой тип.

Объясню на примере.
Код

public interface MyInterface
{
       //... some methods
       float GetMyVal();
}

Один класс
Код

public MyClass1:MyInterface
{
      //... some methods
       float GetMyVal()
       {
               return 1;
       }
}

Второй класс (название такое же MyClass1, но другая сборка проекта)
Код

public MyClass1:MyInterface
{
      //... some methods
       float GetMyVal()
       {
               return 12345;// отличается от другого класса только внутренностей одной функции
       }
}

Оба класса в своих 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() в ....

пробовал другой прием
Код

Type t = ...; //Загруженный тип данных MyClass1 первой сборки
//MyObj - имеет тип MyClass1 второй сборки
MyObj = (MyInterface)Convert.ChangeType(MyObj, t);

Возникает исключение
{"Объект должен реализовывать интерфейс IConvertible."}
Классы большие, со сложной иерархией. Переприсваивать поля вручную очень не хотелось бы, чувствую, должно быть более простое решение.

находил другой прием
Код

public static implicit operator ActualRec(ISomeWrapper someWrapper)
{
    return ((SomeWrapper)someWrapper).SomeInfo;
}

Но проблема в том, что классы имеют одинаковые названия, и подгружаются динамически из Dll

PM MAIL   Вверх
jonie
Дата 13.11.2011, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Вы использовали BinaryFormatter ? Тогда у него есть Binder если я не ошибаюсь  - можно порыть в его сторону.
А можно загружать в старый формат и используя Automapper или подобное преобразовывать на новые классы.

А вообще кто вас надоумил хранить в таком формате файлы?)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Stolzen
Дата 13.11.2011, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: нет
Всего: 48



Попробуйте для старых файлов использовать адаптер. Т.е. оборачивать старые объекты в новые интерфейсы.


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Vladimir_Petrov
Дата 16.11.2011, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 7.1.2007

Репутация: нет
Всего: нет



Цитата(jonie @ 13.11.2011,  17:14)
Тогда у него есть Binder если я не ошибаюсь  - можно порыть в его сторону.

Спасибо за советы.
Получилось загрузить объект типом из новой сборки с помощью двух путей:

1) CopyObjectData через Reflection (написал рекурсивную функцию копирования объекта любой структуры)
2) Binder - простой способ

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

Я не понимаю, как это возможно. Может как то кеширует.
PM MAIL   Вверх
Vladimir_Petrov
Дата 16.11.2011, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 7.1.2007

Репутация: нет
Всего: нет



Прошу прощения, был мой касяк, запутался в файлах. Сохраняю в один, загружаю с другого....
Проблему с переносом объекта на другую сборку решил (писал выше)

Цитата

А вообще кто вас надоумил хранить в таком формате файлы?) 


А как еще можно хранить информацию сложно структурированного объекта, кроме как сериализовать его?
большие файлы очень неудобно сериализовать.
PM MAIL   Вверх
jonie
Дата 16.11.2011, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Цитата(Vladimir_Petrov @  16.11.2011,  13:52 Найти цитируемый пост)

А как еще можно хранить информацию сложно структурированного объекта, кроме как сериализовать его?
большие файлы очень неудобно сериализовать. 

ну например используйте формат не привязанный к платформе (json, xml, bson или какой-нибудь google protobuf) ...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0620 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.