そのため、.NET サーバーと IOS クライアントがあり、プロトコル バッファーを使用してやり取りしようとしています。サーバーには、FormField オブジェクトのリストを含むオブジェクトが 1 つあります。ここで、FormField は実際には、ButtonFormField のような FormField のサブタイプになります。
いくつかの調査を行った後、次のような .proto ファイルを実装しました:継承のための Protobuf-net .proto ファイルの生成
これは、サーバーからクライアントへのシリアル化に適しています。
残念ながら、アイテムをサーバーに送り返すと、CompiledSerializer.cs の 49 行目で FormField を ButtonFormField としてキャストしようとしているため (明らかに機能しません)、エラーが発生します。
これは 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
}
}