Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, mitechka, Вы писали:
M>>Ммм... Хорошо, тогда вопрос — если потомков 2, каждый из них — дженерик, то как определить и привести полученное сообщение именно к нужному потомку? Собственно, основной проблемой для меня было именно это... S> Так попробуй NetDataContractSerializer. Главное, что бы сборки классов были на клиенте и на сервере или в гаке S>Он сам десериализует в нужный объект.
Так, что-то уже я ничего не понимаю... Deserialize метод у NetDataContractSerializer принимает поток, возвращает объект типа object. Который потом уже нужно кастить самостоятельно в нужный тип, разве не так? А вот оный как раз и неизвестен заранее, есть лишь переменная типа Type, которая его хранит.
Если есть пример — приведите, я буду только рад, ручки целовать буду, если покажете, т.к. для меня это достаточно актуально сейчас...
M>Так, что-то уже я ничего не понимаю... Deserialize метод у NetDataContractSerializer принимает поток, возвращает объект типа object. Который потом уже нужно кастить самостоятельно в нужный тип, разве не так? А вот оный как раз и неизвестен заранее, есть лишь переменная типа Type, которая его хранит.
По-прежнему не можем понять, зачем нужны переменные типа Type и зачем чего-то куда-то кастить. Если есть экземпляр какого-то объекта, его тип узнают методом myObject.GetType(), для этого не нужны доп. поля. И даже этот метод вызывать не нужно, потому что:
Здравствуйте, mitechka, Вы писали:
M>Здравствуйте, Serginio1, Вы писали:
S>>Здравствуйте, mitechka, Вы писали:
M>>>Ммм... Хорошо, тогда вопрос — если потомков 2, каждый из них — дженерик, то как определить и привести полученное сообщение именно к нужному потомку? Собственно, основной проблемой для меня было именно это... S>> Так попробуй NetDataContractSerializer. Главное, что бы сборки классов были на клиенте и на сервере или в гаке S>>Он сам десериализует в нужный объект.
M>Так, что-то уже я ничего не понимаю... Deserialize метод у NetDataContractSerializer принимает поток, возвращает объект типа object. Который потом уже нужно кастить самостоятельно в нужный тип, разве не так? А вот оный как раз и неизвестен заранее, есть лишь переменная типа Type, которая его хранит. M>Если есть пример — приведите, я буду только рад, ручки целовать буду, если покажете, т.к. для меня это достаточно актуально сейчас...
Зачем тебе переменная Type?
Тип объекта ты получаешь через объект.GetType()
А получив тип уже можешь делать, что угодно. Можешь привести к интерфейсу, можешь создать хэш таблицу по типу и делегату, динамики итд. Вариантов куча.
Это уже проблема не десериализации , а контрактов для выполнения методов.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, mitechka, Вы писали:
M>Здравствуйте, agat50, Вы писали:
M>Мммм... А в библиотеке есть возможность привести динамически тип по переданному в переменной типу класса?
Как уже ниже отметили, это не проблема с сериализацией. В целом видимо от switch не убежать, или dynamic. Для вызова с generic'ами использовать MakeGenericMethod через reflection.
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, mitechka, Вы писали:
M>>Здравствуйте, Serginio1, Вы писали:
S>>>Здравствуйте, mitechka, Вы писали:
M>>>>Ммм... Хорошо, тогда вопрос — если потомков 2, каждый из них — дженерик, то как определить и привести полученное сообщение именно к нужному потомку? Собственно, основной проблемой для меня было именно это... S>>> Так попробуй NetDataContractSerializer. Главное, что бы сборки классов были на клиенте и на сервере или в гаке S>>>Он сам десериализует в нужный объект.
M>>Так, что-то уже я ничего не понимаю... Deserialize метод у NetDataContractSerializer принимает поток, возвращает объект типа object. Который потом уже нужно кастить самостоятельно в нужный тип, разве не так? А вот оный как раз и неизвестен заранее, есть лишь переменная типа Type, которая его хранит. M>>Если есть пример — приведите, я буду только рад, ручки целовать буду, если покажете, т.к. для меня это достаточно актуально сейчас... S> Зачем тебе переменная Type? S>Тип объекта ты получаешь через объект.GetType() S>А получив тип уже можешь делать, что угодно. Можешь привести к интерфейсу, можешь создать хэш таблицу по типу и делегату, динамики итд. Вариантов куча. S>Это уже проблема не десериализации , а контрактов для выполнения методов.
Тут скорее даже ошибка этапа проектирования. Думал, что получится сделать что-то "максимально общее". Ошибся.
Пока что решил, что будет некий базовый класс сообщения, в котором будет чисто uid, остальные классы будут от него наследоваться. И каждый класс будет реализовывать собственный интерфейс, отвечающий за тип данных, который в нём передаётся. Для значений общего вида это будет IDictionary<string, object> с дальнейшим приведением, например, через dynamic или рефлекшн.
Уже просто нет времени искать грааль, придётся ехать на велосипеде, что сам изобрёл.
Кстати, оффтоп — дайте хорошую книгу на русском по паттернам с примерами на C#. Буду благодарен.
Здравствуйте, mitechka, Вы писали:
M>Уже просто нет времени искать грааль, придётся ехать на велосипеде, что сам изобрёл. M>Кстати, оффтоп — дайте хорошую книгу на русском по паттернам с примерами на C#. Буду благодарен.
M>Спасибо.
Да здесь проблема не в паттернах, а то, что ты хочешь получить от своей иерархии. И от этого уже плясать.
Создавть иерархия с перекрытием методов, Реализовывать шаблонные интерфейсы итд http://habrahabr.ru/post/191934/
и солнце б утром не вставало, когда бы не было меня