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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WCF DataContract, сериализация наследника 
V
    Опции темы
retto
Дата 17.5.2011, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



вопрос по сериализации класса для передачи по WCF

есть интерфейс IMyDescription который описывает некие методы.
есть класс MyDescription который реализует вышеуказанный интерфейс.  
клиент отправляет на сервер этот класс. Всё нормально, все работает отлично.
далее у нас есть класс MyDescriptionExtended который расширяет MyDescription. Дак вот в чем проблема, 
когда я хочу передать этот класс на сервер, WCF выдает ошибку типа "тип MyDescriptionExtended не ожидается", это логично,
поскольку в KnowType тип MyDescriptionExtended не указан, поскольку находится в другой сборке.

И вопрос по сути: как его заставить при передачи класса MyDescriptionExtended сериализировать базовый класс MyDescription ?
PM MAIL   Вверх
-Mikle-
Дата 17.5.2011, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Ну либо делаешь метод который работает с конкретным типом, либо используешь кастомный KnowType. KnowType можно помечать не только сам класс, но и сервис и, кажется, отдельный метод. Также, можно сделать статический метод в любом месте кода и указать его в KnowType, который бы реализовывал более сложную логику по определению типов.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
retto
Дата 17.5.2011, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



-Mikle-, 
Цитата(-Mikle- @  17.5.2011,  13:45 Найти цитируемый пост)
Ну либо делаешь метод который работает с конкретным типом

нельзя, сервер незнает(и не должен) об этом типе ровно ничего, знает только о MyDescription


Цитата(-Mikle- @  17.5.2011,  13:45 Найти цитируемый пост)
либо используешь кастомный KnowType

класс MyDescriptionExtended находится в другой сборке, и reference кинут так, что нельзя указать KnowType
PM MAIL   Вверх
-Mikle-
Дата 17.5.2011, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Ты видимо не до конца понял, что я имею ввиду. Или я не понял.
Как я понимаю щас: у тебя есть MyDescription в Ассембли1. Есть его наследник MyDescriptionExtended в Ассембли2 (ссылка на Ассембли1 разумеется). Тебе надо добавить наунтайп к MyDescription, но ты типа не можешь этого сделать потому что из Ассембли1 естественно не видно Ассебли2. Так?

Если да, то:
1) Можно добавить наунтайп через конфиг сервиса (в самом конце есть пример), так как сервису они известны оба. А тут структура и описание секции конфига.
2) Можно применить атрибут, как я уже сказал, к сервису (ServiceKnownType) и там указать MyDescriptionExtended.
3) Если уж совсем плохо, то DataContractResolver спасет в любом случае.



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
retto
Дата 17.5.2011, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(-Mikle- @  17.5.2011,  21:27 Найти цитируемый пост)
Ты видимо не до конца понял, что я имею ввиду. Или я не понял.

попробую объяснить по-другому.
1. Есть класс M1
2. Есть класс M2 : M1
3. Есть метод DoSomething(M1 m1);

дак вот, хочу сделать так, чтобы когда я вызываю метод DoSomething и передаю туда M2 он сериализировался по базовому классу. Другая сторона, тобишь сервер ничего(!) незнает о классе M2. 

кажись расписал понятно.
PM MAIL   Вверх
-Mikle-
Дата 17.5.2011, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



То есть на сервере тебе и не надо ничего от М2?

Тогда попробуй обмануть так:
Код

[Datacontract(Name="M1")]
public class M2 : M1
{
........
}


Может прокатить по идее.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
retto
Дата 17.5.2011, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(-Mikle- @  17.5.2011,  22:11 Найти цитируемый пост)
То есть на сервере тебе и не надо ничего от М2?

именно.

Цитата(-Mikle- @  17.5.2011,  22:11 Найти цитируемый пост)
Тогда попробуй обмануть так:
код C#
1:
2:
3:
4:
5:
[Datacontract(Name="M1")]
public class M2 : M1
{
........
}


неа, не обманывается. Все равно говорит что незнает ничего о типе M2
PM MAIL   Вверх
-Mikle-
Дата 18.5.2011, 06:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



А ты смотрел DataContractResolver? Я давал ссылку выше. Может с ним получится. Если нет, то ничего кроме как создать экземпляр M1 (если он создаваемый) и скопировать значения свойств из M2 пока не вижу.
А в прошлом эксперименте ты Namespace правильно задавал?


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
retto
Дата 18.5.2011, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(-Mikle- @  18.5.2011,  06:20 Найти цитируемый пост)
А в прошлом эксперименте ты Namespace правильно задавал? 

естественно да =)


Цитата(-Mikle- @  18.5.2011,  06:20 Найти цитируемый пост)
А ты смотрел DataContractResolver?

у меня ограничение .Net Framework 3.5 , а DataContractResolver в 4 фреймворке.
PM MAIL   Вверх
retto
Дата 18.5.2011, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



заюзал DataContractResolver и .Net Framework 4
все работает, всем спасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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