WCF:如何使用DataContractSerializer序列化DataTable?

时间:2012-01-25 09:25:18

标签: wcf serialization

我有一些wcf服务:

[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序列化。

1 个答案:

答案 0 :(得分:-1)

svcutil 实用程序会生成客户端代码,该代码对XmlSerializer无法处理的类型使用DataContractSerializer,否则这是默认选项。< / p>

但是,您可以强制 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();
}