Сериализатор DataContract:почему бы не удалить участников?
Вопрос
Я читал Microsoft Лучшие практики:Управление версиями контракта данных, и они заявляют:
Не удаляйте элементы данных в более поздних версиях, даже если Требуется свойство было оставлено в свойстве по умолчанию ЛОЖЬ в предыдущих версиях.
Может ли кто-нибудь подсказать причину этого?Они не уточняют.Поскольку они говорят, что добавлять элементы данных в более поздней версии можно, похоже, что и удаление тоже подойдет — по сути, старая версия будет рассматривать это как добавление.
Разница, я полагаю, заключается в том, что вы должны добавлять новых членов в конце (используя свойство Order в DataMemberAttribute), тогда как удаляемое свойство, вероятно, не будет в конце.Но они также говорят, что для отсутствующих элементов во время загрузки будут оставлены значения по умолчанию, поэтому ясно, что с отсутствующими элементами все в порядке.
Что мне не хватает?Какие проблемы с взаимодействием версий я могу вызвать (как с прямой, так и с обратной совместимостью), если я устарею функцию своего продукта и удалю связанное с ней свойство [DataMember]?
Кроме того, если бы я решил, что меня не интересует прямая совместимость (т. е. если бы меня не беспокоило, что старые версии открывают новые файлы), будут ли возникать какие-либо подобные проблемы?
Решение
Просто потому, что внешние потребители услуг могут предоставлять/использовать эти данные (они были созданы до того, как вы удалили некоторых участников).Если вы изменили подпись метода службы, DataContractSerializer
не смогу распознать DataContract
больше из-за неизвестных элементов данных.
Таким образом, если все ваши потребители услуг известны, вы можете легко манипулировать элементами данных по своему усмотрению, если вы:
- не ломайте потребителей или
- должным образом проинформировать их об изменении
Другие советы
Одна из проблем заключается в том, что даже если он не сломается во время сериализации/десериализации, вы можете выбросить данные, а это означает, что вы не сможете успешно передать данные обратно вызывающему абоненту.то естьучитывая простой метод:
public SomeType Echo(SomeType obj) {
return obj;
}
Если вызывающий объект передает вам старый объект с дополнительным свойством, он может захотеть вернуть это значение.Вы можете включить это (отдельно) с помощью данные расширения API, но, честно говоря, люди редко этим заморачиваются.