WCF: Как сериализовать DataTable, используя DataContractSerializer? - PullRequest
2 голосов
/ 25 января 2012

У меня есть служба 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 голосов
/ 25 января 2012

Утилита svcutil генерирует код на стороне клиента, который использует XmlSerializer для типов, которые не могут быть обработаны DataContractSerializer , в противном случае это значение по умолчаниюchoice.

Однако вы можете заставить svcutil использовать один сериализатор поверх другого с помощью переключателя /serializer:

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

В качестве альтернативы можно применить XmlSerializerFormatAttribute к операции GetDataTable only , чтобы он использовал XmlSerializer , в то время как остальная часть контракта будет продолжать использовать DataContractSerializer :

[ServiceContract]
[DataContractFormat]
public interface IMyService
{
   [OperationContract]
   FooResult GetFoo(FooRequest request);

   [OperationContract]
   [XmlSerializerFormat]
   DataTable GetDataTable();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...