2011-05-07 22 views
30

Estoy escribiendo el servicio WCF y su cliente. Deseo enviar/recibir objetos de mis clases personalizadas, entre el servicio y el cliente.Son los atributos de DataContract necesarios para WCF

tengo 3 módulos

  • servicio WCF
  • WCF cliente
  • biblioteca de clases común

Tanto el servicio WCF y el cliente tienen referencias a la biblioteca de clase común. No quiero marcar toda mi clase con los atributos de DataContract.

Entonces, mi pregunta "¿Se requieren atributos de DataContract para WCF?"

Uso .NET 4 y netTcpBinding.

Respuesta

22

Si recuerdo correctamente (IIRC), si no usa marcadores formales de contrato de datos, de manera predeterminada actúa como un serializador de campo. Esto funcionará, pero es menos fácil de versionar, ya que los cambios privados pueden romper el cliente/servidor. OMI siempre debe decorar formalmente los tipos de WCF con los atributos de contrato de datos/miembro de datos. Funcionará sin ellos, pero por las razones equivocadas (IIRC, originalmente no funcionó sin marcadores formales).

+25

Realmente pensé que IIRC es un término técnico. Descubierto significa 'si recuerdo bien'. jaja! – thewpfguy

+2

Bien mierda, durante años siempre pensé que significaba "Si repito", supongo que tiene más sentido que la R y la C representen diferentes palabras. –

+2

http://msdn.microsoft.com/en-us/library/ms733127%28v=vs.110%29.aspx indica que solo las propiedades y los campos públicos de lectura/escritura se incluyen en el contrato de manera predeterminada. –

3

No es necesario para utilizar los atributos DataContract, su servicio va a funcionar muy bien sin ellos.

Habiendo dicho eso, realmente no creo que tener su servicio y el cliente compartan una biblioteca de clase es el mejor enfoque de diseño. Sería mucho más claro si expones tus tipos a través de DataContracts.

¿Qué pasaría si algún día alguien quiere consumir su servicio pero no tiene acceso a la biblioteca de clases compartida?

+0

Solo mi cliente trabajará con ese servicio. – user179437

+0

Cuando el servicio tiene un método ([OperationContract]), que tiene un argumento de mi clase personalizada y esa clase no tiene un constructor predeterminado, recibo InvalidDataContractException del host del servicio WCF. – user179437

+0

Incluso si su servicio y el cliente comparten una biblioteca de clase, WCF intentará serializar sus tipos y para eso necesita un constructor predeterminado. Su diseño viola los principios mismos del diseño del servicio web y yo argumentaría que sería mejor usar algo más como .NET remoto. –

7

"es DataContract atributos necesarios para WCF"

Técnicamente, no. Esto depende de si usa el DataContractSerializer o no (que es el predeterminado en muchas vinculaciones).

hay otras opciones:

  1. Considere serializadores alternativas
  2. trate de usar Data Contract Surrogates (atributos aún se requieren algún lugar, pero significa potencialmente u puede salir de su clase sin tocar, si eso es relevante)
  3. Confíe en el serialization defaults para cuando serializa clases sin atributos de Contrato de datos
+0

Reciclado de descripción de contrato. Sospecho que podría usar la descripción del contrato para cambiar el serializador de alguna manera – Schneider

Cuestiones relacionadas