私はいくつかの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によって直列化されます。
通常、DataTableをサービスの出力として余りにも多くの余分なデータとして送信することはお勧めできません。いくつかのデータ転送オブジェクトを作成する方が良いでしょう。これはおそらくシリアライゼーションの問題も解決するでしょう。 – ElDog
同じサービスに対して2つのシリアル化エンジンを使用することはできません。 SOAはDataTableについて何も知らない。サービスコントラントは言語に依存しません。PHPやPythonはあなたのDataTableで何をしますか? :) ElDogが言ったように、データ転送オブジェクトを使いやすくする。 – Artru
私は@ElDogと完全に同意しますが、POCOは一般的にサービス契約で優先されるべきです、私はWCFが相互運用可能なサービスについてのみではなく、分散システムを構築するための汎用技術であることを指摘しなければなりません。クライアントが.NETに基づいていることがわかっている場合、[シリアル化できる]限り、サービス契約で.NET固有の型を使用しても問題は発生しません(http://msdn.microsoft.com/ en-us/library/aa347876.aspx)を参照してください。 –