2010-04-28 90 views
13

WCF的Data Contract Serializer是否支持System.Tuple类(即,我可以将Tuple对象传递给WCF调用和/或作为部分或全部结果接收它们)?通过WCF发送一个Tuple对象?

我发现this page,但不是明确的,明确的“你可以发送和接收元组与WCF”我希望的答案。

我猜,你可以,只要所有类型Tuple本身都是由数据协定序列化支持 - 谁能给我提供了更明确的答案?谢谢。

+0

元组应该在WCF中正常工作,只要元组内的类型是基本类型,而不是自定义类型。如果是这样,那么它将导致对客户端的循环依赖,因为客户端不会是Tuple ,它将是TupleT。我现在遇到了问题。 Web服务中的泛型似乎不是一个好主意。 – irperez 2012-05-04 19:45:25

回答

14

Tuple类型标记为SerializableAttribute,因此,如果您存储在其中的类型是可序列化的,那么它们也应该能够由WCF序列化。

退房:中Tuple'1链接,Tuple'2,等它说:

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

请注意,您链接的文档包含以下行:

的[Serializable接口]/ISerializable的编程模型在部分信任环境中不受支持。

因此,它可能并不像看起来那么容易。

(顺便说一句,在Tuple static class也值得一试。)

9

我只是挖成这个自己,它似乎是,如果你通过Silverlight的消费WCF服务的一个问题可能是:看Davy Brion's blog为更多。

元组的Silverlight版本没有Seri​​alizable属性,这个属性目前存在问题。

5

我有与.NET 4.0和WCF很好地工作的Tuple(提醒:你需要.NET 4.0的Tuple支持)。

这里是单元测试方法(其经由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 

这里是接口:

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

这里是实现:

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

我刚刚通过使用“WCF服务应用程序”(参见New..Project)进行调试来测试它, e WCF服务。我使用这种方法进行调试,因为我可以使用调试器从WCF客户端无缝步入WCF服务,并再次返回,这在有些时候非常有用。

我刚刚也通过将它部署到控制台应用程序和服务应用程序来测试这种方法,所以它肯定对我有用。

+0

在使用.Net 4.71的调用应用程序和使用.Net 4.61 for WCF和其他类库的工作WCF服务上尝试了它。得到这个errormessage:无法将类型NameOfServiceReference.TupleofBooleanint转换为System.Tuple 。同样的错误消息,当我尝试类ValueTuple而不是Tuple。 – JRB 2017-11-09 21:46:21