protobuf の繰り返しフィールドの対応物として List を使用するのは正しいですか? 私はこれを試していますが、常に例外が発生しました:
ワイヤ タイプが無効です。これは通常、切り詰めたり長さを設定したりせずにファイルを上書きしたことを意味します。Protobuf-net の使用を参照してください。未知のワイヤ タイプに関する例外が突然発生しました。
バッファ全体は次のとおりです (最初のメッセージ、次に到着するメッセージがこれに追加されます): 9 8 5 26 5 24 238 98 32 1
Java protobuf ファイル:
package XXX;
option java_package = "XXX";
option java_outer_classname = "Protos";
option optimize_for = SPEED;
message V3DDelta {
optional int32 bid = 1;
optional int32 bidSize = 2;
optional int32 ask = 3;
optional int32 askSize = 4;
}
message Request {
optional int32 type = 1;
optional string request = 2;
}
message Response {
optional int32 type = 1;
optional string response = 2;
repeated V3DDelta v3dDelta = 3;
}
および protbuf-net クラス:
[ProtoContract]
public class V3DDelta {
[ProtoMember(1)]
public double bid { get; set; }
[ProtoMember(2)]
public int bidSize { get; set; }
[ProtoMember(3)]
public double ask { get; set; }
[ProtoMember(4)]
public int askSize { get; set; }
}
[ProtoContract]
public class Request {
[ProtoMember(1)]
public int Type { get; set; }
[ProtoMember(2)]
public string Rq { get; set; }
}
[ProtoContract]
public class Response {
[ProtoMember(1)]
public int Type { get; set; }
[ProtoMember(2)]
public string Rsp { get; set; }
[ProtoMember(3)]
public List<V3DDelta> v3dDelta { get; set; }
public Response() {
v3dDelta = new List<V3DDelta>();
}
}
V3DDelta[] を試してみましたが、結果は同じです。メッセージを読む:
Response rsp = Serializer.DeserializeWithLengthPrefix<Response>(rcvstream, PrefixStyle.Base128);
Javaメッセージでは、writeDelimitedToを使用して送信されます。C# のバッファは Java とまったく同じです。na v3dDelta フィールドがあった場合、すべてが期待どおりに機能します。