Как повлиять на поведение десериализации сообщения. GetBody <T>() - PullRequest
2 голосов
/ 02 февраля 2011

У меня достаточно опыта работы с DataContractSerializer и обработкой сериализации пользовательских типов с использованием IDataContractSurrogate. Сегодня я узнал о новом DataContractResolver в .NET 4.0, который, по-видимому, предоставляет аналогичную и более слабосвязанную реализацию IDataContractSurrogate.

Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно предоставить некоторое пользовательское поведение де / сериализации, которое используется при вызове Message.GetBody ().

Рассматриваемая полезная нагрузка Message имеет (среди прочего) открытое свойство чтения / записи, которое возвращает «объект». Придуманный пример:

public class MessageContents
{
   public int SomeValue { get; set; }
   public object SomeData { get; set; }
}
...
MessageContents entity = new MessageContents { SomeValue = 1, SomeData = new Whatever() };
Message entityMessage = Message.CreateMessage(
   MessageVersion.Soap12WSAddressing10,
   String.Format("{0}Request", operation),
   entity);
...
entityMessage.GetBody<MessageContents>()

Вызов GetBody <> () выбрасывает обычное исключение «невозможно десериализовать нераспознанный тип« Безотносительно »». При непосредственном использовании DataContractSerializer у меня не возникло проблем с решением проблемы, но, поскольку GetBody <> () использует свой собственный DataContractSerializer, как я могу повлиять на это поведение десериализации?

Причина, по которой я имею дело с сообщениями напрямую, заключается в том, что рассматриваемый интерфейс службы возвращает большие объемы потоковых данных, а WCF требует от меня заключения договора на работу с типами сообщений.

Я пытался добавить поведение DataContractSerializerOperationBehavior в мой интерфейс службы (для каждой операции), но зарегистрированный DataContractResolver никогда не срабатывает.

У кого-нибудь есть предложения?

1 Ответ

2 голосов
/ 02 февраля 2011

Можно использовать метод Message.GetBody (XmlObjectSerializer) и передать правильно настроенный экземпляр класса DataContractSerializer :

var knownTypes = new string[] { "Whatever" };
var serializer = new DataContractSerializer(typeof(MessageContents), knownTypes);

MessageContents contents = message.GetBody<MessageContents>(serializer);

Связанные ресурсы:

...