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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сериализация неизвестного объекта. WebService 
:(
    Опции темы
neutrino
Дата 2.3.2007, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



Приветствую!

Архитектура следующая: веб-сервис состоит в основном из одного класса - MonitoringEngine, который выполняет комманды ICommand. Типов комманд много и в момент выполнения MonitoringEngine'у неизвестно какая именно комманда выполняется. Он знает только интерфейс ICommand и ему этого достаточно для выполнения комманд.
Метод, который выполняет комманды называется MonitoringEngine.perform(ICommand command). Oн возвращает объект класса CommandResponse, который содержит два поля: первое типа bool (успешно ли было выполнение комманды) и второе типа object, которое содержит объект результата выполнения комманды. Есть комманды у которых нет этого объекта (он null), есть комманды с различными классами объектов результата (список, какой-нибудь класс ...).

Вопрос: Как сериализировать этот CommandResponse? Я не могу знать в момент выполнения какие именно данные содержит этот класс. Только самa комманда знает что ей необходимо вернуть в CommandResponse.

Премного благодарен за любую помощь.

С уважением, нейтрино.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
tol05
Дата 2.3.2007, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Как вариант: 
1 - Если поле типа object может содержать объект пользовательского типа - сделать этот тип серилизуемым (встроенные типы сами серилизуемые, так что там проблем не будет). Далее, после возврата объекта CommandResponse спокойно отдавать его серилизатору, он сам все проверит и серилизует
2 - рефлексия. Проверять поддерживает ли возвращенный объект интерфейс ISerializable и если да, отдавать его серилизатору.


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
neutrino
Дата 5.3.2007, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



Цитата(tol05 @  2.3.2007,  09:13 Найти цитируемый пост)
Если поле типа object может содержать объект пользовательского типа - сделать этот тип серилизуемым (встроенные типы сами серилизуемые, так что там проблем не будет). Далее, после возврата объекта CommandResponse спокойно отдавать его серилизатору, он сам все проверит и серилизует

Как сериализатор может знать что находится в поле типа object?

Код

namespace core.commands
{
    /// <summary>
    /// Class represents response of command.
    /// </summary>
    [Serializable]
    public class CommandResponse
    {
        private object data;
        private bool succeed;

        public CommandResponse()
        {
        }

        public CommandResponse(bool succeed, object data)
        {
            this.data = data;
            this.succeed = succeed;
        }

        public object getData()
        {
            return data;
        }

        public bool commandsucceed()
        {
            return succeed;
        }
    }
}

Может ему необходимо прописать что-то вроде:
Код

if (data is ArrayList)
{
// Serialize data as ArrayList
}
else if (data is ...)
{
...
}
else ...



--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
mr.DUDA
Дата 5.3.2007, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Цитата(neutrino @  5.3.2007,  17:20 Найти цитируемый пост)
Как сериализатор может знать что находится в поле типа object?

А он (десериализатор) и не знает, в отличие от сериализатора (которому доступна полная инфа о типах свойств и методов объекта). Что он может узнать по бинарному содержимому стрима smile ? Всё зависит от типа сериализации (включается ли в результат имя конкретного типа объекта, или нет).


--------------------
user posted image
PM MAIL WWW   Вверх
tol05
Дата 6.3.2007, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Про десерилизатор разговора не было smile Кстати, я бы не стал включать в файл всякие дескрипшины, десерилизовать в необходимый объект, если эксепшион, то значит, не судьба.
А о серилизаторе - действительно, лажу спорол, нет у них внутри Serialize() проверок на интерфейс. 
Реализаций может быть много. Например, 
Код

if (data is ArrayList)
{
// Serialize data as ArrayList
}
else if (data is ...)
{
...
}
else ...


можно заменить на 
Код

try
{
myFormatter.Serialize(myStream, data);
}
catch (SerializationException e) 
{
    Console.WriteLine("Failed to deserialize. May be data don't support Serilialize oprration? Message: " + e.Message);
     throw;
}

в этом случае, если когда-нибудь добавится еще один вид коллекции или класса, не прийдется дописывать новые проверки

или 
Код

if(data is ISerializable)
{
myFormatter.Serialize(myStream, data);
}


или
Код

MethodInfo mi = data.GetType().GetMethod("GetObjectData");
if(!mi.Equals(null))
{
data.GetType().InvokeMember(...)
}


или что-то еще в этом духе


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

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




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


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

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