2012-01-25 10 views
2

私はいくつかのWCFサービスがあります。このサービスsvcutilによって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; } 
} 

は、DataContractSerializerによってシリアル化の種類を生成します。

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

今のXmlSerializerによってすべてのタイプをシリアル化型を生成svcutils:今、私は、DataTableを返すメソッドを追加します。しかし、私はすべての型(DataTableを含む)がDataContractSerializerによって直列化されるか、DataTableだけがXmlSerializerによって直列化される必要がありますが、他の型はDataContractSerializerによって直列化されます。

+2

通常、DataTableをサービスの出力として余りにも多くの余分なデータとして送信することはお勧めできません。いくつかのデータ転送オブジェクトを作成する方が良いでしょう。これはおそらくシリアライゼーションの問題も解決するでしょう。 – ElDog

+1

同じサービスに対して2つのシリアル化エンジンを使用することはできません。 SOAはDataTableについて何も知らない。サービスコントラントは言語に依存しません。PHPやPythonはあなたのDataTableで何をしますか? :) ElDogが言ったように、データ転送オブジェクトを使いやすくする。 – Artru

+0

私は@ElDogと完全に同意しますが、POCOは一般的にサービス契約で優先されるべきです、私はWCFが相互運用可能なサービスについてのみではなく、分散システムを構築するための汎用技術であることを指摘しなければなりません。クライアントが.NETに基づいていることがわかっている場合、[シリアル化できる]限り、サービス契約で.NET固有の型を使用しても問題は発生しません(http://msdn.microsoft.com/ en-us/library/aa347876.aspx)を参照してください。 –

答えて

-1

svcutilユーティリティは、そうでなければ、デフォルトの選択であるDataContractSerializerによって処理することができないタイプのXmlSerializerを使用するクライアント側のコードを生成します。

しかし、あなたは/serializerスイッチと他の上に1つのシリアライザを使用する svcutil を強制することができます

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

また、あなたにだけGetDataTableサービス操作XmlSerializerFormatAttributeを適用することができXmlSerializerを使用し、残りの契約で引き続き使用します。:

[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 –

関連する問題