IExtensibleDataObject о сериализации, и его можно использовать за пределами стека службы WCF. Его основная цель - обходить разные версии контракта данных без потери информации. Например, в первой версии вашего контракта у вас есть такой тип:
[DataContract(Name = "Person")]
public class Person : IExtensibleDataObject {
ExtensionDataObject IExtensibleDataObject.ExtensionData { get; set; }
[DataMember(Order = 0)] public string Name;
[DataMember(Order = 1)] public int Age;
}
Вы разворачиваете свои службы с этим типом данных, и у вас есть клиенты, использующие этот тип. Некоторые сервисные операции возвращают Person клиенту, и клиент может отправить эти объекты обратно в сервис, как в примере ниже.
[ServiceContract]
public interface ITest {
[OperationContract] Person[] GetAllPeople();
[OperationContract] void DoSomething(Person person);
}
Все это прекрасно работает, пока изменение в бизнес-логике не потребует добавления нового участника в Person, а резервная база данных требует, чтобы это поле присутствовало (не ноль).
[DataContract(Name = "Person")]
public class Person_V2 : IExtensibleDataObject {
ExtensionDataObject IExtensibleDataObject.ExtensionData { get; set; }
[DataMember(Order = 0)] public string Name;
[DataMember(Order = 1)] public int Age;
[DataMember(Order = 2)] public string Address;
}
Без IExtensibleDataObject существующие клиенты получают объект Person, заполняют его свойство Name / Age и незамедлительно отбрасывают переданный ему элемент Address. И когда он вызывает метод DoSomething с этим объектом, он передает экземпляр, который будет недействительным на сервере (адрес будет нулевым).
Что делает IEDO, так это включает этот сценарий, при котором существующие (устаревшие) клиенты могут продолжать получать новые версии контрактов на данные от службы - клиент заполняет поля, которые он понимает, данными из службы и теми элементами, которые он не делает. непонятно, будут ли храниться в ExtensionDataObject, чтобы их можно было повторно идентифицировать позже. В приведенном выше примере устаревшие клиенты смогут только читать свойства «Имя» и «Возраст» объекта Person, но при отправке объекта обратно на сервер сериализованные данные будут содержать все три свойства.
Это была длинная история о IEDO. IExtensibleObject не имеет ничего общего с сериализацией - речь идет о подключении расширений к некоторым предопределенным объектам в стеке WCF service (хост, контекст операции, контекст экземпляра и контекстный канал). Не так интересно, как IEDO, поэтому я остановлюсь здесь:)
Отредактировано : для полноты информации, если вам нужна дополнительная информация о IExtensibleObject, вы можете проверить сообщение по адресу http://blogs.msdn.com/b/carlosfigueira/archive/2012/01/31/wcf-extensibility-iextension-and-iextensibleobject.aspx.