Protobuf.net WCF 反序列化列表<T>
Posted
技术标签:
【中文标题】Protobuf.net WCF 反序列化列表<T>【英文标题】:Protobuf.net WCF Deserialize List<T> 【发布时间】:2010-10-28 06:40:29 【问题描述】:我尝试将 WCF 与 protobuf-net r.282 一起使用
好的。我用 ProtoBehavior 属性标记我的合同
[OperationContract,ProtoBehavior]
[FaultContract(typeof(ServiceFaultException))]
Dictionary<ActivityCategoryDTO, SalesTemplateDTO> GetSalesTemplates();
[OperationContract, ProtoBehavior]
[FaultContract(typeof(ServiceFaultException))]
List<ActivityCategoryDTO> GetActivities();
接下来,-DTO:
[DataContract]
[Serializable]
[ProtoContract]
public class ActivityCategoryDTO
[DataMember]
[ProtoMember(1)]
public int Id get; set;
[DataMember]
[ProtoMember(2)]
public string Guid get; set;
[DataMember]
[ProtoMember(3)]
public string Name get; set;
我尝试从客户端使用此服务。当我调用 GetSalesTemplates 时 - 一切正常。我有成功的反序列化字典,但是当我调用 GetActivities 时,我在客户端得到了 null。 通过fiddler我看到,数据传输成功,所以我认为是反序列化问题。
怎么了?如何在客户端获取列表?
编辑
看来我的所有列表都有问题:)
[DataContract]
[Serializable]
[ProtoContract]
public class SalesTemplateDTO
[ProtoMember(1)]
[DataMember]
public string Name get; set;
[ProtoMember(2)]
public List<FieldTemplateDTO> Fields;
它来到客户端只是名称,字段列表再次为空。虽然所有的数据也是传输的。
【问题讨论】:
嗨安德鲁 - 抱歉耽搁了;最近很多“忙”。下面分析解释一下。 【参考方案1】:好的;我已经复制了,这实际上看起来是 IDE/svcutil 拒绝重用 DTO 程序集中的服务合同(接口),即使它正在重用数据合同(类)。 mex 生成的服务合同(接口)缺少必要的额外属性,因此 protobuf-net 永远不会被要求反序列化。
两种选择:
选项 1
use configuration rather than code 定义 protobuf 用法;这样做的好处是无需对客户端或服务器进行任何更改即可使用它。
选项 2
不要使用生成的服务包装器 - 通用的对应物可以简单地写成:
public class Client<T> : ClientBase<T> where T : class
public T Service get return Channel;
public Client()
public Client(string endpointConfigurationName) :
base(endpointConfigurationName)
public Client(string endpointConfigurationName, string remoteAddress) :
base(endpointConfigurationName, remoteAddress)
public Client(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
base(endpointConfigurationName, remoteAddress)
public Client(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
base(binding, remoteAddress)
然后消费为:
using (var svc = new Client<IService1>())
var data = svc.Service.GetActivities();
【讨论】:
谢谢!!!有用。我遵循扩展配置方式。但是现在我遇到了枚举问题..【参考方案2】:我完全不知道;我可以调查,但目前还不行。作为一个实用的解决方法(直到我找到原因),也许返回类似 ActivityResult
类的东西,包含 List<ActivityCategoryDTO>
作为成员?
【讨论】:
不幸的是,这种解决方法没有帮助,我仍然没有决定。以上是关于Protobuf.net WCF 反序列化列表<T>的主要内容,如果未能解决你的问题,请参考以下文章
如何判断 protobuf.net 中的反序列化是不是失败?