模仿Protobuf-net v2中的继承

时间:2012-08-29 19:37:44

标签: c# ios ios5 protobuf-net

所以我有一个.NET服务器和一个IOS客户端,我正在尝试使用协议缓冲来回通信。在服务器上,我有一个包含FormField对象列表的对象,其中FormField实际上将是FormField的子类型,比如说ButtonFormField。

在做了一些研究之后,我实现了类似于这样的.proto文件:Protobuf-net .proto file generation for inheritance

适用于从服务器到客户端的序列化。

不幸的是,当我将项目发送回服务器时,我收到错误,因为它试图将FormField强制转换为ButtonFormField(显然不起作用)在CompiledSerializer.cs第49行。

这在protobuf-net v2中不起作用还是我做错了什么?我真的希望能让这个工作。

修改* 我尝试使用protobuf-net v1,它确实有效,所以我假设这个行为在v2中发生了变化。是否有另一种方法可以在v2中执行此操作,或者我暂时停留在v1上?

编辑2: 对不起延迟马克。这是一个减少.proto和C#类。我正在使用protoc来生成IOS类,所以我假设使用protoc生成C ++或Java,因为客户端也会产生相同的效果。

工作样本原型文件

message PersonSelectionFormField {
}

message TextFormField {
}

message FormFieldDto {
  //Properties and optional properties truncated for brevity
  required int32 Id = 1;
  required int32 FieldTemplateId = 6;
  required int32 RowId = 9;  

  optional PersonSelectionFormField PersonSelectionFormField = 55;
  optional TextFormField TextFormField = 59;
}

namespace Sample.Fields
{
     //I get a list of FormFields back from the client
    [ProtoContract]
    [ProtoInclude(55, typeof(PersonSelectionFormField))]
    [ProtoInclude(59, typeof(TextFormField))]
    public class FormField:IFormField
    {
        //Cleaned up for brevity...There are virtual methods and fields 
        //getting overriden but they aren't relevant to the example

        [ProtoMember(1)]
        public int Id { get; set; }

        [ProtoMember(6)]
        [Required]
        public int FieldTemplateId { get; set; }

        [ProtoMember(9)]
        [Required]
        public int RowId { get; set; }
    }

    public class TextFormField:FormField
    {
        //Some overriden field / methods. 
        //None of the serialized fields are overriden
    }

    public class PersonSelectionFormField:FormField
    {
        //Some overriden field / methods. 
        //None of the serialized fields are overriden
    }   
}

0 个答案:

没有答案