配置WCF以将数组反序列化为不带svcutil的集合

时间:2014-04-14 07:29:47

标签: wcf c#-4.0 collections deserialization wcf-serialization

我有一个net.tcp WCF服务及其客户端,每个服务都在一个程序集中,并共享另一个包含服务接口和DTO的程序集。

使用通过Channel实例化的ChannelFactory将客户端实现为服务的代理:

public ServiceClient : IService
{
   IService _channel;

   public ServiceClient()
   {
      _channel =  new ChannelFactory<IService>("NetTcp_IService")
         .CreateChannel();
   }

   public DTO ServiceMethod()
   {
       return _channel.ServiceMethod();
   }
}

public class DTO
{
   public IList<int> SomeList;
}

正如预期的那样,客户端返回的DTO的SomeList字段是一个数组,但我希望它由WCF转换为List。正如您可能怀疑所描述的设置,我不使用svcutil (或添加服务参考对话框),所以{{ 3}}

我不想修改客户端代理以实例化列表并在我的客户端代理中修改收到的DTO,因为实际实现使用命令处理器使用通过依赖注入解析的接口 - 时间避免耦合 - 这个解决方案会做相反的事情,要求客户端执行已知的服务命令。

因此,我目前正在使用I can't use configureType

public class DTO
{
   private IList<int> _someList;
   public IList<int> SomeList
   {
      get { return _someList; }
      set {
         if (value != null)
            _someList = new List<int>(value);
         else
            _someList = new List<int>();
      }
   }
}

但是,我宁愿避免这种情况。所以问题是:

如何配置WCF反序列化以便array转换为预期的List

有没有办法通过App.config中的绑定或Channel创建时的代码来配置反序列化?可能通过the work-around which modifies the DTO to internally create the List instanceImportOptions.ReferencedCollectionTypes

1 个答案:

答案 0 :(得分:1)

有四种方式:

  1. 在客户端

  2. 的保存方法中将数据转换为List
  3. 更改属性类型:

    public IList<int> SomeList;
    

    public List<int> SomeList;
    
  4. 您在上面显示的方法(更改分配类型)。

  5. Implement IDataContractSurrogate。但是你必须在客户端应用一种行为。