2010-04-28 16 views
13

¿La clase System.Tuple es compatible con el Serializador de contrato de datos de WCF (es decir, ¿puedo pasar los objetos Tuple a las llamadas WCF y/o recibirlas como parte o la totalidad del resultado)?Enviando un objeto Tuple sobre WCF?

Encontré this page, pero no el claro, definitivo "puedes enviar y recibir Tuples con WCF" respuesta que estaba esperando.

supongo que se puede, siempre y cuando todos los tipos dentro de la Tuple sí se apoyan en los Datos del Contrato Serializador - ¿alguien puede proporcionar una respuesta más definitiva? Gracias.

+0

Las tuplas deberían funcionar bien en WCF siempre que los tipos dentro de la tupla sean tipos básicos, no personalizados. Si es así, generará una dependencia circular en el cliente porque el cliente no será un Tuple , será TupleT.Estoy teniendo problemas con esto ahora. El genérico en los servicios web parece ser una mala idea. – irperez

Respuesta

14

Los Tuple tipos están marcados con SerializableAttribute, por lo tanto, si los tipos se almacenan dentro son serializable, deben ser capaces de ser serializado por la WCF también.

Salida: enlaces de Tuple'1, Tuple'2, etc. Dice:

[SerializableAttribute] 
public class Tuple<T1> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple 

Tenga en cuenta que el documento se ha vinculado contiene la siguiente línea:

El [Serializable]/modelo de programación ISerializable no es compatible en un entorno de confianza parcial.

Por lo tanto, puede que no sea tan fácil como parece.

(Por cierto, el Tuple static class es también vale la pena echarle un vistazo.)

9

sólo estaba cavando en esto por mí mismo, y parece que una cuestión podría ser si usted está consumiendo el servicio WCF a través de Silverlight: ver para Davy Brion's blog Más.

La versión Silverlight de Tuple no tiene el atributo Serializable, que plantea un problema en la actualidad.

5

Tengo Tuples funcionando muy bien con .NET 4.0 y WCF (recordatorio: necesita .NET 4.0 para compatibilidad con Tuple).

Aquí es el método de prueba de la unidad (que llama al método a través de la capa de WCF):

/// <summary> 
/// Test Tuples 
/// </summary> 
[TestMethod()] 
public void WcfTestTupleUnit() 
{ 
    Tuple<double, double> x; 
    x=CallViaWCF.testTuple(); 
    Assert.AreEqual(x.Item1, 42); 
    Assert.AreEqual(x.Item2, 43); 
} 
#endregion 

Aquí es la interfaz:

[OperationContract] 
Tuple<double, double> testTuple(); 

Aquí es la implementación:

public Tuple<double, double> testTuple() 
{ 
    return new Tuple<double, double>(42, 43); 
} 

Acabo de probarlo depurando usando una "Aplicación de servicio WCF" (ver Nuevo ... Proyecto), que sirve para e Servicio WCF. Utilizo este método para la depuración, ya que puedo usar el depurador para pasar sin problemas del cliente WCF al servicio WCF, y viceversa, lo cual es bastante útil a veces.

También acabo de probar este método desplegándolo tanto en una aplicación de consola como en una aplicación de servicio, por lo que definitivamente me funciona.

+0

Lo intenté en un servicio WCF que funciona con .NET 4.71 para la aplicación de llamada y con .Net 4.61 para WCF y otras bibliotecas de clase. Obtuve este mensaje de error: No se puede convertir el tipo NameOfServiceReference.TupleofBooleanint en System.Tuple . El mismo mensaje de error cuando probé la clase ValueTuple en lugar de Tuple. – JRB