2012-01-25 87 views
2

我有一些WCF服務:WCF:如何使用DataContractSerializer序列化DataTable?

[ServiceContract(SessionMode = SessionMode.Allowed)] 
public interface IMyService 
{ 
    [OperationContract] 
    [TransactionFlow(TransactionFlowOption.Allowed)] 
    FooResult GetFoo([NotNull] FooRequest request); 
} 

[DataContract(Name = "FooRequest", Namespace = "...")] 
public class FooRequest 
{ 
    [DataMember(IsRequired = true)] 
    [NotNull] 
    public DateTime From { get; set; } 
} 

,該業務SvcUtil工具生成,通過DataContractSerializer的序列化類型。現在,我想補充方法返回的DataTable:

[OperationContract] 
[TransactionFlow(TransactionFlowOption.Allowed)] 
[FaultContract(typeof(IikoNetServiceFault))] 
System.Data.DataTable GetDataTable(); 

現在svcutils生成序列化的所有類型的XmlSerializer的類型。但是我需要所有類型(包括DataTable)都由DataContractSerializer序列化,或者只有DataTable由XmlSerializer序列化,但其他類型由DataContractSerializer序列化。

+2

通常,將DataTable作爲服務的輸出發送,太多的額外數據並不是一個好主意。會更好地創建一些數據傳輸對象。這很可能也解決了序列化問題。 – ElDog

+1

對於相同的服務,您不能擁有兩個序列化引擎。 SOA對DataTable沒有任何瞭解。服務的不兼容性與語言無關,PHP或Python會對您的DataTable執行什麼操作? :)更好地使用ElDog所說的數據傳輸對象。 – Artru

+0

即使我完全同意@ElDog,POCO通常應該在服務合同中被優先考慮,但我必須指出,WCF不僅僅是關於可互操作的服務,而是構建分佈式系統的通用技術。如果已知客戶端基於.NET,只要[它們可以被序列化],我在服務合同中看不到使用.NET特定類型的問題(http://msdn.microsoft.com/ EN-US /庫/ aa347876.aspx)。 –

回答

-1

使用該XmlSerializer用於不能由DataContractSerializer來處理,這是否則默認選擇類型的SvcUtil工具實用程序生成的客戶端代碼。

但是,您可以強制SvcUtil工具比其他使用一個串行器與/serializer開關:

svcutil /serializer:DataContractSerializer http://server/myservice.svc 

或者,你可以在GetDataTable服務操作應用XmlSerializerFormatAttribute,以使其使用XmlSerializer而合同的其餘部分將繼續使用DataContractSerializer

[ServiceContract] 
[DataContractFormat] 
public interface IMyService 
{ 
    [OperationContract] 
    FooResult GetFoo(FooRequest request); 

    [OperationContract] 
    [XmlSerializerFormat] 
    DataTable GetDataTable(); 
} 
+0

我試過了,這並沒有影響生成的代碼。 – user876743

+0

@ user876743我用另一種解決方案更新了我的答案。 –

+0

這是因爲DataContractSerializer將始終回退到在特定條件下使用XmlSerializer,您可以在這裏閱讀:http://msdn.microsoft.com/en-us/library/ms733112.aspx –

相關問題