1

http://code.google.com/p/metasyntactic/wiki/ProtocolBuffersを使用して、iphone から protobuf-net を使用する C# プログラムと通信しようとしています。

残念ながら、私が受け取った (C# ソース コードから生成された) .proto ファイルには、protoc が拒否している行が含まれています。

repeated Pair_Guid_List`1 Local = 6;

これは、ソース データが C# ディクショナリであり、値として Guid キーとクラスがあるためと思われます。これにうまく対処する方法はありますか?

使用されている protobuf-net のバージョンは r278.zip です。

(これらの protobuf の送受信はすべて正常に動作します。これが問題になるのは、iPhone をミックスに追加したときだけです。)

更新: マークのおかげですべてが機能するようになりました!

C# 側のオブジェクトは次のようになりました。

[ProtoMember(7)]
public Dictionary<Guid, List<Pages>> ReceivedPages { get; set; }

.proto で次を使用して正常に機能しました。

message PagesDict {
  required bcl.Guid guid = 1;
  repeated Pages Pages = 2;
}

問題のメッセージには次が含まれます。

  repeated PagesDict ReceivedPages = 7;
4

1 に答える 1

1

まず、iPhoneでprotobuf-net を使用しようとしていますか? v1 は monotouch 経由では動作しないと予想されます。v2機能します (これは v2 の作業の大きな推進力でした) が、まだリリースされていません (使用可能ですが、現時点では不完全です)。あなたがこれをやろうとしているなら、それが問題になるので教えてください;-p

私は彼らが .proto を呼び出すことによってその .proto を取得したと思っていますがSerializer.GetProto<T>、残念ながらこれは、特に次のようなことDictionary<,>が関係している場合には、絶対確実ではありません (v2 で修正するために TODO を追加します)。

良いニュースは、次のようにモデル化さDictionary<TKey,TValue>れることです。repeated someTypesomeType

message someType {
    required keyType key = 1;
    required valueType value = 2;
}

また、 (bcl.proto)Guidとしてモデル化されます。これは次のとおりです。bcl.Guid

message Guid {
  optional fixed64 lo = 1; // the first 8 bytes of the guid
  optional fixed64 hi = 2; // the second 8 bytes of the guid
}

ただし、.NET から .NET への作業の場合、"proto" はまったく必要ないことに注意してください。互換性のあるタイプのみ。

于 2010-03-29T05:13:44.163 に答える