所以我有一个 .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
}
}