1

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

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

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

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

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

编辑* 我使用 protobuf-net v1 进行了尝试,它确实有效,所以我假设这种行为在 v2 中发生了变化。在 v2 中是否有另一种方法可以做到这一点,还是我现在停留在 v1 上?

编辑 2: 抱歉,Marc 耽搁了。这是一个精简的 .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
    }   
}
4

0 回答 0