通过WCF发送元组对象?

15

System.Tuple类是否受WCF的数据合同序列化器支持(即,我可以将Tuple对象传递给WCF调用和/或作为结果的一部分或全部接收)?

我找到了这个页面,但没有明确、确定的“您可以使用WCF发送和接收元组”的答案。

我猜想只要Tuple内部的所有类型都受数据合同序列化器支持,就可以这样做。有人能给我提供更明确的答案吗?谢谢。


只要元组内部的类型是基本类型而不是自定义类型,元组在WCF中应该可以正常工作。如果使用自定义类型,则会导致客户端出现循环依赖,因为客户端将不是Tuple<T>,而是TupleT。我现在遇到了这个问题。在Web服务中使用泛型似乎不是一个好主意。 - irperez
3个回答

16

Tuple类型标有SerializableAttribute,因此,如果您存储的类型是可序列化的,则它们应该也能够被WCF序列化。

请查看:Tuple'1Tuple'2等链接。它们显示:

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

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

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

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

(顺便说一下,Tuple static class 也值得一看。)


9

我刚刚自己研究了一下,似乎问题可能出在如果您通过Silverlight使用WCF服务:请参见Davy Brion的博客获取更多信息。

Tuple的Silverlight版本没有Serializable属性,这在目前是一个问题。


5

我已经成功地在.NET 4.0和WCF中使用元组(提醒:您需要.NET 4.0才能支持元组)。

以下是单元测试方法(通过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)进行调试测试了它,该应用程序提供WCF服务。我使用此方法进行调试,因为我可以使用调试器轻松地从WCF客户端进入WCF服务,然后再返回,这在某些时候非常有用。

我还通过将其部署到控制台应用程序和服务应用程序中进行了测试,所以对我来说肯定有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接