DataContractSerializer: почему бы не удалить участников? - PullRequest
5 голосов
/ 13 мая 2009

Я читал Рекомендации Microsoft: управление версиями контракта данных , и они утверждают:

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 13 мая 2009

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

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

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

2 голосов
/ 13 мая 2009

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

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

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