У меня достаточно опыта работы с 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 никогда не срабатывает.
У кого-нибудь есть предложения?