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