1

そのため、.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
    }   
}
4

0 に答える 0