2010-04-28 89 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