Sending a Tuple object over WCF?

2019-06-15 00:51发布

Is the System.Tuple class supported by WCF's Data Contract Serializer (i.e., can I pass Tuple objects to WCF calls and/or receive them as part or all of the result)?

I found this page, but not the clear, definitive "you can send and receive Tuples with WCF" answer I was hoping for.

I'm guessing that you can, as long as all of the types within the Tuple itself are supported by the Data Contract Serializer -- can anyone provide me with a more definitive answer? Thanks.

3条回答
叛逆
2楼-- · 2019-06-15 01:02

The Tuple types are marked with SerializableAttribute, therefore, if the types you store within are serializable, they should be able to be serialized by WCF as well.

Check out: links of Tuple'1, Tuple'2, etc. It says:

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

Note that the document you linked contains the following line:

The [Serializable] / ISerializable programming model is not supported in a partial trust environment.

So, it may not be as easy as it would seem.

(BTW, the Tuple static class is also worth checking out.)

查看更多
Root(大扎)
3楼-- · 2019-06-15 01:20

I was just digging into this myself, and it seems that one issue might be if you're consuming the WCF service through Silverlight: see Davy Brion's blog for more.

The Silverlight version of Tuple doesn't have the Serializable attribute, which poses an issue at present.

查看更多
戒情不戒烟
4楼-- · 2019-06-15 01:22

I have Tuples working nicely with .NET 4.0 and WCF (reminder: you need .NET 4.0 for Tuple support).

Here is the unit test method (which calls the method via the WCF layer):

/// <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

Here is the interface:

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

Here is the implementation:

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

I just tested it by debugging using a "WCF Service Application" (see New..Project), which serves the WCF service. I use this method for debugging, as I can use the debugger to step seamlessly from the WCF client into the WCF service , and back again, which is quite useful at times.

I've also just tested this method by deploying it to both a console app, and a service app, so its definitely working for me.

查看更多
登录 后发表回答