我有一些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序列化。
通常,将DataTable作为服务的输出发送,太多的额外数据并不是一个好主意。会更好地创建一些数据传输对象。这很可能也解决了序列化问题。 – ElDog
对于相同的服务,您不能拥有两个序列化引擎。 SOA对DataTable没有任何了解。服务的不兼容性与语言无关,PHP或Python会对您的DataTable执行什么操作? :)更好地使用ElDog所说的数据传输对象。 – Artru
即使我完全同意@ElDog,POCO通常应该在服务合同中被优先考虑,但我必须指出,WCF不仅仅是关于可互操作的服务,而是构建分布式系统的通用技术。如果已知客户端基于.NET,只要[它们可以被序列化],我在服务合同中看不到使用.NET特定类型的问题(http://msdn.microsoft.com/ EN-US /库/ aa347876.aspx)。 –