Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Распределённые приложения и сеть > Сериализация неизвестного объекта. |
Автор: neutrino 2.3.2007, 09:52 |
Приветствую! Архитектура следующая: веб-сервис состоит в основном из одного класса - MonitoringEngine, который выполняет комманды ICommand. Типов комманд много и в момент выполнения MonitoringEngine'у неизвестно какая именно комманда выполняется. Он знает только интерфейс ICommand и ему этого достаточно для выполнения комманд. Метод, который выполняет комманды называется MonitoringEngine.perform(ICommand command). Oн возвращает объект класса CommandResponse, который содержит два поля: первое типа bool (успешно ли было выполнение комманды) и второе типа object, которое содержит объект результата выполнения комманды. Есть комманды у которых нет этого объекта (он null), есть комманды с различными классами объектов результата (список, какой-нибудь класс ...). Вопрос: Как сериализировать этот CommandResponse? Я не могу знать в момент выполнения какие именно данные содержит этот класс. Только самa комманда знает что ей необходимо вернуть в CommandResponse. Премного благодарен за любую помощь. С уважением, нейтрино. |
Автор: tol05 2.3.2007, 10:13 |
Как вариант: 1 - Если поле типа object может содержать объект пользовательского типа - сделать этот тип серилизуемым (встроенные типы сами серилизуемые, так что там проблем не будет). Далее, после возврата объекта CommandResponse спокойно отдавать его серилизатору, он сам все проверит и серилизует 2 - рефлексия. Проверять поддерживает ли возвращенный объект интерфейс ISerializable и если да, отдавать его серилизатору. |
Автор: mr.DUDA 5.3.2007, 23:42 |
А он (десериализатор) и не знает, в отличие от сериализатора (которому доступна полная инфа о типах свойств и методов объекта). Что он может узнать по бинарному содержимому стрима ![]() |
Автор: tol05 6.3.2007, 10:27 | ||||||||
Про десерилизатор разговора не было ![]() А о серилизаторе - действительно, лажу спорол, нет у них внутри Serialize() проверок на интерфейс. Реализаций может быть много. Например,
можно заменить на
в этом случае, если когда-нибудь добавится еще один вид коллекции или класса, не прийдется дописывать новые проверки или
или
или что-то еще в этом духе |