【问题标题】:protobuf-net property indexersprotobuf-net 属性索引器
【发布时间】:2013-12-11 02:06:33
【问题描述】:

在 protobuf-net 中,
是否有计划添加对无属性 POCO 的支持,以避免属性索引 (ProtoContact)?

为 DTO 上的每个属性添加索引没有问题。

我使用我的实用程序自动创建 DTO,并且有一个 protobuf 成员的配置标志。

问题在于使用带有 ServiceStack 的 RESTful 服务,

我与客户(在 .Net 中工作)共享 2 个程序集,

  1. 没有任何依赖关系的模型,也没有 ServiceStack(不是 IReturn),也没有 protobuf-net。

  2. client.requests,它是对实际服务调用的精简包装,带有一些验证,

    错误处理等。本质上是对每个服务的简化调用。

    这个程序集依赖于 ServiceStack 客户端和 Protobuf-net。

但是该模型是无依赖的,因为客户可以直接在他们的业务层中使用它。

在这种情况下,我有 protobuf-net 的问题,而不是 ServiceStack 的问题,因为 IReturn 不是强制性的。

是否有任何解决方案,以避免添加 protobuf 索引器?

更新:感谢 Mark Gravell,他在此处和 previous related question

中的回答

解决方案是替代内联属性,

[XmlType]/[XmlElement(Order=key)] 仅使用 System.Xml,

或 [DataContract]/[DataMember(Order=key)] 使用 System.Runtime.Serialization。

所以模型是无依赖的,没有引用 protobuf-net。

我应该读得更好。

         [XmlType("Person")]
        public class Person
        {
          [XmlElement(Order = 1)]
          public string Name { get; set; }

          [XmlElement( Order = 2)]
          public string Address { get; set; }
       }

谢谢

【问题讨论】:

    标签: servicestack protobuf-net


    【解决方案1】:

    2 个选项出现:

    • 如果生成的代码是partial 类,您可以为相同类型创建一个第二个部分类文件,并添加属性那里 - 就是这样同类型的一部分;特别要注意[ProtoPartialMember(...)]可以添加到一个类型(多次),但描述一个成员;或者如果您想减少维护,可以使用[ProtoContract(ImplicitFields=ImplicitFields.AllPublic)] 让模型控制规则(但在执行此操作之前请阅读ImplicitFields 上的智能提示)
    • 您可以在运行时配置类型,使用您想要的任何规则,通过RuntimeTypeModel

      var metaType = RuntimeTypeModel.Default.Add(yourType, false);
      // TODO: some reflection that decides what members you want to serialize
      // and as what keys
      foreach(...)
          metaType.Add(member, key);
      

    【讨论】:

    • 我更喜欢第一个选项,因为我可以生成代码。问题:第二个选项有反射开销?
    • @stefan2410 仅在您配置模型时,您只会执行一次
    • 另外,关于部分类的更重要的问题。您的意思是在客户端,我将同时提供用于客户集成的无依赖模型程序集和具有属性的模型以及用于实际服务调用的 client.requests 程序集?或者客户端不需要属性。
    • @stefan2410 我不认为我的意思是这两件事。我的意思是,如果通过任何机制生成了一些partial 类,那么一个选项 是通过在第二个文件中使用partial class 添加属性。现在,根据上面的第二个项目符号,确实不需要属性 - 它们比通过代码配置模型更方便
    • 我之前并不清楚。我已经理解了这两个选项。第二个选项对我来说不可行,因为 DTO 是与客户一起预定义的(CRUD 或查询结果)。要在代码中序列化它们,似乎很容易出错。我上面问的是,在第一个选项中,(也许是天真的问题)客户端代码需要密钥来反序列化缓冲区?我想是的 。在这种情况下,通过部分类,我可以为客户提供一个无依赖模型以进一步集成到其系统中,并为实际客户请求提供一个带有原型键的模型组件。对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多