Как добавить новое свойство обратно совместимым способом? - PullRequest
0 голосов
/ 16 июня 2020

У меня есть приложение, служба WCF и сериализуемый класс, который создается с помощью xsd.exe. Приложение отправляет объект этого класса в службу WCF, которая затем его обрабатывает. Теперь у меня есть следующее требование: в класс нужно добавить новое свойство. Тип нового свойства - перечисление. Изменение должно быть обратно совместимым. Это означает, что приложение будет продолжать отправлять объекты V1, а служба WCF уже будет работать с классом V2. Упрощенный xsd для V2:

<xs:simpleType name="Option">
    <xs:restriction base="xs:string">
        <xs:enumeration value="Option1" />
        <xs:enumeration value="Option2" />
        <xs:enumeration value="Option3" />
    </xs:restriction>
</xs:simpleType>
<xs:complexType name="Data">
    <xs:attribute name="PreviousAttribute" type="xs:boolean" use="required" />
    <!-- The new property -->
    <xs:attribute name="NewAttribute" type="Option" use="optional" default="Option1" />
</xs:complexType>

Если объект V1 прибывает в службу WCF, которая уже работает с V2, я получаю следующее исключение на уровне WCF (у меня есть только локализованное исключение и переведено его так это не точный английский sh текст):

Модуль форматирования выдал исключение при попытке десериализации сообщения: Произошла ошибка при попытке сериализации параметра [...]. Сообщение InnerException было "Элемент" "previousAttributeField" из пространства имен "[...]" не ожидается. Ожидается элемент 'newAttributeField'. '.

Возможно ли то, чего я пытаюсь достичь? Если да, то как нужно определить новое свойство?

...