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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Десериализация объекта 
V
    Опции темы
WERITAS
Дата 12.11.2007, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Москва

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



Доброго времени суток! При десериализации объекта я не знаю его тип, поэтому десериализую в Object. Как дальше привести к требуемому типу (моему пользовательскому классу)?
Код

 BinaryFormatter outFormatterObj = new BinaryFormatter();
outFormatterObj.Deserialize(Stm); // Stream Stm
Object obj = (Object)outFormatterObj.Deserialize(Stm);

if (obj.GetType() == typeof(CAnswerChoose))
     CAnswerChoose answ = (CAnswerChoose)obj.Clone();  // <-- Так сделать не получается (Clone - замещенный метод интерфейса ICloneable)

Stm.Close();



--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
tol05
Дата 12.11.2007, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

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



то, что при десерилизации возвращается object - это не страшно. 
Запомни: object.GetType() всегда вернет реальный тип объекта. Именно поэтому и возможно обратное приведение к типу (т.е. тип1 в object, а потом object в тип1, но не в тип2). Т.е.
Код

int i = 10;
object obj = i;
int j = (int)obj;//ок
double j = (double)obj;//error

никогда не думал, а как это CLR знает, что obj можно привести к int и нельзя к double? smile

Если тебе нужно клонирование, так и приводи возвращенный объект к ICloneable и вызывай Clone(), почти везде ссылки на интерфейс используются именно в таких случаях.
Код

[Serializable]
        class work :ICloneable
        {
            static void Main(string[] args)
            {
                MemoryStream Stm = new MemoryStream();
                work w = new work();
                BinaryFormatter outFormatterObj = new BinaryFormatter();
                outFormatterObj.Serialize(Stm, w);

                Stm.Position = 0;

                Object obj = outFormatterObj.Deserialize(Stm);
                Stm.Close();

                //для наглядности, в принципе можно обойтись и одним obj
                Type t = obj.GetType(); 
                if(Equals(t, typeof(work)))
                {
                    ((work)obj).Func();//Или через Activator и Type invocations, чтобы сохранить абстрактность
                }

                if(t is ICloneable)
                {
                    ((ICloneable)obj).Clone();
                }

            }

            void Func()
            {
                
            }


            public object Clone()
            {
                return null;
            }
        }


Это сообщение отредактировал(а) tol05 - 13.11.2007, 00:00


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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