5

estaba leyendo Microsoft de Best Practices: Data Contract Versioning, y afirman:DataContractSerializer: ¿por qué no eliminar miembros?

No retire los miembros de datos en versiones posteriores, incluso si el isRequired propiedad fue dejada en su propiedad predeterminada de falsa en las versiones anteriores.

¿Alguien puede sugerir alguna razón para esto? Ellos no elaboran. Dado que dicen que está bien agregar miembros de datos en una versión posterior, parece que eliminarlos también estaría bien; de hecho, la versión anterior lo vería como un complemento.

La diferencia, supongo, es que se supone que debes agregar nuevos miembros al final (usando la propiedad Order en DataMemberAttribute), mientras que la propiedad que se eliminará probablemente no sea al final. Pero también dicen que los miembros faltantes se quedarán en su valor predeterminado durante la carga, por lo que está claro que los miembros faltantes están bien.

¿Qué me estoy perdiendo? ¿Qué problemas de interoperabilidad de versión causaría (tanto la compatibilidad con versiones anteriores como la compatibilidad con versiones anteriores) si obsoletos una característica de mi producto y eliminé la propiedad [DataMember] que la acompaña?

Además, si decidiera que no estaba interesado en la compatibilidad con versiones anteriores (es decir, si no me preocupaban las versiones anteriores que abren archivos más nuevos), ¿se aplicarán dichos problemas?

Respuesta

2

Simplemente porque los consumidores del servicio externo pueden proporcionar/usar esa información (se crearon antes de eliminar algunos miembros). En caso de que haya cambiado la firma del método de servicio, DataContractSerializer ya no podrá reconocer DataContract, debido a los miembros de datos desconocidos.

Así que si sus consumidores de servicios son todos conocidos, se puede manipular fácilmente los miembros de datos en su propia voluntad, siempre y cuando:

  • no se rompen los consumidores o
  • adecuadamente informarles del cambio
2

Un problema es que incluso si no se interrumpe durante la serialización/deserialización, podría estar desperdiciando datos, lo que significa que no puede enviar datos de ida y vuelta con éxito a la persona que llama. es decir, teniendo en cuenta el método simple:

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

Si la persona que llama que está pasando el objeto de edad con la propiedad adicional, puede ser que deseen que el valor de vuelta. Puede habilitar esto (por separado) con la API extension data, pero francamente la gente rara vez se molesta con esto.

Cuestiones relacionadas