Вопрос

Я читал Microsoft Лучшие практики:Управление версиями контракта данных, и они заявляют:

Не удаляйте элементы данных в более поздних версиях, даже если Требуется свойство было оставлено в свойстве по умолчанию ЛОЖЬ в предыдущих версиях.

Может ли кто-нибудь подсказать причину этого?Они не уточняют.Поскольку они говорят, что добавлять элементы данных в более поздней версии можно, похоже, что и удаление тоже подойдет — по сути, старая версия будет рассматривать это как добавление.

Разница, я полагаю, заключается в том, что вы должны добавлять новых членов в конце (используя свойство Order в DataMemberAttribute), тогда как удаляемое свойство, вероятно, не будет в конце.Но они также говорят, что для отсутствующих элементов во время загрузки будут оставлены значения по умолчанию, поэтому ясно, что с отсутствующими элементами все в порядке.

Что мне не хватает?Какие проблемы с взаимодействием версий я могу вызвать (как с прямой, так и с обратной совместимостью), если я устарею функцию своего продукта и удалю связанное с ней свойство [DataMember]?

Кроме того, если бы я решил, что меня не интересует прямая совместимость (т. е. если бы меня не беспокоило, что старые версии открывают новые файлы), будут ли возникать какие-либо подобные проблемы?

Это было полезно?

Решение

Просто потому, что внешние потребители услуг могут предоставлять/использовать эти данные (они были созданы до того, как вы удалили некоторых участников).Если вы изменили подпись метода службы, DataContractSerializer не смогу распознать DataContract больше из-за неизвестных элементов данных.

Таким образом, если все ваши потребители услуг известны, вы можете легко манипулировать элементами данных по своему усмотрению, если вы:

  • не ломайте потребителей или
  • должным образом проинформировать их об изменении

Другие советы

Одна из проблем заключается в том, что даже если он не сломается во время сериализации/десериализации, вы можете выбросить данные, а это означает, что вы не сможете успешно передать данные обратно вызывающему абоненту.то естьучитывая простой метод:

public SomeType Echo(SomeType obj) {
    return obj;
}

Если вызывающий объект передает вам старый объект с дополнительным свойством, он может захотеть вернуть это значение.Вы можете включить это (отдельно) с помощью данные расширения API, но, честно говоря, люди редко этим заморачиваются.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top