2012-01-25 60 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 –

相关问题