Este decission depende del uso de un servicio WCF que:
- servicio interno consumida por usted administra sistemas .NET, que comparten las mismo modelo de dominio.
- Servicio externo consumido por diferentes plataformas, que no comparten el mismo modelo de dominio.
Caso 1.
serialización - es el proceso de persistir el estado del objeto. El estado del objeto en C# está representado por sus campos de datos.
Las propiedades en C# son esencialmente métodos que manipulan el estado del objeto. Su uso puede dar como resultado una deserialización diferente del estado del objeto, ya que el orden en que se establecen las propiedades puede tener un impacto en su estado de datos final. Otros factores pueden provocar una deserialización de estado incorrecta también, si, por ejemplo, el método (conjunto de propiedades) se basa en un contexto que está cambiando, como DateTime actual.
Usted puede decir ¿qué pasa con la encapsulación? No quiero que mi objeto esté en estado inválido, y debo hacer comprobaciones de validación, verificaciones de integridad del gráfico de objetos, etc. Sí, deberías, ¿así que ponemos los atributos de DataMember en puntales? No.
El problema aquí es que muchas personas mezclan dos cosas diferentes, DTO (objeto de transferencia de datos, contrato WCF) con la entidad de dominio. Lo que necesita es asegurarse de que los datos que recibe sean, en esencia, los mismos que se enviaron, y luego asegurarse de que puede construir una Entidad de dominio válida a partir de estos datos. La mejor manera de lograr esto es usar clases separadas para DTO, y construir una Entidad de dominio a partir de ellas.
Pero la mayoría de los programadores son flojos, y les gusta decorar de forma sencilla la entidad de dominio con los atributos de DataMemeber. En este caso, la decisión Campo o Prop depende de dónde está su lógica de validación; si su lógica de validación está oculta en los métodos Establecer, deberá usar los Apoyos, si es externo, debe usar Campos y validar su Entidad de dominio después de la desirialización.
P.S. Creo que las mismas reglas se aplican a cualquier proceso de serialización, como la persistencia de la base de datos.
Además, me gustaría mencionar que Silverlight no puede serializar \ deserializar campos privados, porque no puede acceder a ellos desde fuera mediante el uso de la reflexión, y deberá hacerlo privado y usar InternalsVisibleToAttribute.
Caso 2.
Este es uno duro. El enfoque principal aquí es la interoperabilidad. En el 99.9% tendrá clases separadas de DTO en este caso y lo más probable es que haya una gran cantidad de versiones diferentes para apoyar a clientes antiguos. No importa dónde coloque DataMembers attribs en esto, porque usa DTO's. No me molestaré en explicar este escenario, porque los desarrolladores que trabajan en un sistema de gran escala suelen tener bastante experiencia y no se molestan en leer SO.
no necesita convertir una variable privada en un miembro de datos. –