protobuf-net属性索引器

时间:2013-12-11 02:06:33

标签: servicestack protobuf-net

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

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

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

问题是在服务堆栈中使用RESTful服务,

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

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

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

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

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

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

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

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

    更新:感谢 Mark Gravell ,他的回答在previous related question

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

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

    使用System.Runtime.Serialization

    或[DataContract] / [DataMember(Order = key)]。

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

    我应该读得更好。

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

    感谢

1 个答案:

答案 0 :(得分: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);