Pergunta

Eu estava lendo do Microsoft Melhores Práticas: Dados do Contrato Versioning , e eles afirmam:

Não remova membros de dados em versões posteriores, mesmo que o IsRequired propriedade foi deixada em sua propriedade padrão de false em versões anteriores.

Alguém pode sugerir qualquer razão para isso? Eles não elaborar. Uma vez que eles dizem que é bom para adicionar membros de dados em uma versão posterior, parece que a remoção seria bom também -. Forma eficaz, a versão mais antiga iria vê-lo como um add

A diferença, eu acho, é que você é suposto para adicionar novos membros no final (usando a propriedade Order na DataMemberAttribute), enquanto que a propriedade se removido provavelmente não seria no final. Mas eles também dizem que os membros ausentes serão deixados pelo seu valor padrão durante o carregamento, por isso é claro que os membros ausentes são OK.

O que eu estou ausente? Que versão de interoperabilidade problemas que eu iria causar (ambos frente-a compatibilidade e compatibilidade com versões anteriores) se eu obsoleto uma característica do meu produto e removeu o [DataMember] propriedade que vai com ele?

Além disso, se eu decidi que eu não estava interessado em diante-compatibilidade (ou seja, se eu não estava preocupado com as versões mais antigas abrir arquivos mais recentes), que tais problemas ainda se aplicam?

Foi útil?

Solução

Simplesmente porque fora os consumidores de serviços podem fornecer / uso que os dados (que foram criados antes de você removido alguns membros). No caso de você mudou assinatura do método serviço, DataContractSerializer não será capaz de reconhecer DataContract mais, por causa dos membros de dados desconhecidos.

Portanto, se seus consumidores de serviços são todos conhecidos, você pode facilmente manipular membros de dados em sua própria vontade, desde que você:

  • não quebrar os consumidores ou
  • informá-los adequadamente da mudança

Outras dicas

Uma questão é que, mesmo se ele não quebrar durante a serialização / desserialização, você poderia estar jogando fora de dados - o que significa que você não pode com sucesso round-trip dados de volta para o chamador. ou seja, dado o método simples:

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

Se o chamador está passando o objeto antigo com a propriedade extra, eles podem querer que o valor de volta. Você pode ativar este (separadamente) com a extensão API de dados , mas francamente as pessoas raramente se preocupar com isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top