protobuf-net 嵌套类支持?订单注释?

Posted

技术标签:

【中文标题】protobuf-net 嵌套类支持?订单注释?【英文标题】:protobuf-net nested classes support ? order annotation? 【发布时间】:2013-12-11 18:02:40 【问题描述】:

protobuf-net 是否支持嵌套类?

属性类型名称和顺序是否正确?

如下代码,使用替代属性 XmlType/XmlElement 代替 ProtoContract/ProtoInclude

     using System.Xml.Serialization;

    [XmlType("Person")]
    public class Person
    
      [XmlElement(ElementName = "Display Name",Order = 1)]
      public string Name  get; set; 

      [XmlElement(ElementName = "Age", Order = 2)]
      public byte  Age  get; set; 

      [XmlType("Person.Address")]
      public class Address
      
          [XmlElement(ElementName = "Street",Order = 1)] 
           // before I had  Order=3 to be unique, but as Mark says 
           // the "Order  only needs to be unique inside a single type"
          public string Street  get; set; 

          [XmlElement(ElementName = "ZIP",Order =2)]
          public string Zip  get; set; 

              
   

更新,在我下面的回答中,我写了最后一个类,用 protobuf 实现了一个 ServiceStack 服务。

【问题讨论】:

应该可以 - 您看到问题了吗?如果是这样:究竟是什么?请注意,“Order”只需要在单个类型中是唯一的 - 它可以是 Address 中的 1 和 2,因为 Address 不与 Person 共享任何内容。 我还没有测试它。对不起,我在尝试之前问过。我同意地址类中的订单。顺便说一句,我准备在几个相关的问题中测试它,如果可以的话。 1. XmlType 的命名应该遵循一些规则? 2. ProtoContact 和 XmlType 属性有什么区别(如果有的话)?除了 Inheritance [ProtoInclude(7, typeof(SomeDerivedType)] 中的明显内容。BRB 与我的测试。 Protobuf-net 根本不使用名称,除非您使用 GetSchema。不同之处在于 XML 属性不会强制 protobuf 依赖项进入 DTO,但 protobuf 属性可以让您更具体地控制序列化。 马克,我更新了我的测试,在我对 wiki 的回答中。它工作正常。只有我对 ServiceStack 3.9.71 和 protobuf-net 版本有问题,如果你有时间,请查看my question there。 【参考方案1】:

在 Marc Gravell 的帮助下,我了解了嵌套类在 protobuf 中的工作原理。

我使用 ServiceStack(版本 3.9.71)服务对其进行了测试,它运行良好。

这是模型。

using System.Xml.Serialization;

[XmlType("Person")]
public class Person

     [XmlElement(ElementName = "Display Name", Order = 1)]
     public string Name  get; set; 

     [XmlElement(ElementName = "Age", Order = 2)]
     public byte Age  get; set; 

     [XmlElement(ElementName = "Contact Address", Order =3)] // the address instance
     public Address ContactAddress  get; set; 

     [XmlElement(ElementName = "Person Id", Order = 4)]
     public int  Id  get; set; 

        [XmlType("Person.Address")]
        public class Address
        
          [XmlElement(ElementName = "Street", Order = 1)]
          // before I had  Order=5 to be unique, but as Mark says 
          // the "Order  only needs to be unique inside a single type"
          public string Street  get; set; 

         [XmlElement(ElementName = "ZIP", Order = 2)]
         public string Zip  get; set; 

       

ServiceStack 请求

     public class PersonRequest
      
        public string Zip  get; set; 
        public byte Age  get; set; 
        public int Id  get; set; 
      
     public class AddressRequest
     
       public string Zip  get; set; 

     

AppHost.Configure 中的 ServiceStack 路由。 (自托管服务)

   Routes        
      .Add<PersonRequest>("/Person/Id", "GET, OPTIONS")
      .Add<PersonRequest>("/Persons/Zip", "GET, OPTIONS")

      .Add<AddressRequest>("/Addresses/Zip", "GET, OPTIONS");

服务

第一种情况,我们使用 Zip 过滤器询问具有联系地址的人员列表

第二种情况,使用 Zip 过滤器的地址列表,与人员无关

public List<Person>  Get(PersonRequest request)

  List<Person> persons=new List<Person>();
  persons.Add(new Person()
   Name = "stefan", ContactAddress = new Person.Address()Street="North Pole");
    return  persons;

public List<Person.Address>  Get(AddressRequest request)
    // it returns only addresses filtered by Zip
  List<Person.Address> addresses=new List<Person.Address>();         
  addresses.Add( new Person.Address()  Street = "North Pole"   );
  return  addresses;

ServiceStack 客户端代码,使用 ProtoBufServiceClient

 using ServiceStack.Plugins.ProtoBuf;
        ...
 var client = new ProtoBufServiceClient(serverUri);
 List<Person> persons = client.Get<List<Person>>(serverUri + @"/Persons/600617");
 List<Person.Address> addresses = 
               client.Get<List<Person.Address>>(serverUri + @"/Addresses/600617");

非常感谢,马克。

【讨论】:

以上是关于protobuf-net 嵌套类支持?订单注释?的主要内容,如果未能解决你的问题,请参考以下文章

ProtoBuf-Net 错误消息 - “不支持嵌套或锯齿状列表和数组”

Protobuf-net:嵌套的 IEnumerable 对象

android错误:RealmClass注释不支持嵌套类

protobuf-net v2 是不是需要 DataMember(Order=n) 注释?

类对象作为成员

protobuf-net:如何注释派生类型的属性?