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&lt;ActivityCategoryDTO&gt; 作为成员?

【讨论】:

不幸的是,这种解决方法没有帮助,我仍然没有决定。

以上是关于Protobuf.net WCF 反序列化列表<T>的主要内容,如果未能解决你的问题,请参考以下文章

使用 Protobuf .net 反序列化单个结构字段

如何判断 protobuf.net 中的反序列化是不是失败?

.NET Core protobuf-netMessagePackJson.NET序列化/反序列化性能测试

Protobuf.net 异常 - 检查元数据时超时

Protobuf.net 内存使用情况

列表的 Protobuf.net 对象图序列化