ProtoBuf シリアル化されたメッセージを介して、Google と通信している動作中の Java クライアントがあります。現在、そのクライアントを C# に変換しようとしています。
パラメータがオプションの文字列である.proto
ファイルがあります。appId
protobuf-net ライブラリによって生成される C# 表現のデフォルト値は、同じファイルの Java 表現と同様に空の文字列です。
message AppsRequest {
optional AppType appType = 1;
optional string query = 2;
optional string categoryId = 3;
optional string appId = 4;
optional bool withExtendedInfo = 6;
}
Java クライアントで明示的に設定appId
すると、クライアントが動作を停止することがわかりました (403 Bad Request from Google)。Javaクライアントで""
明示的に設定appId
すると、すべてが機能しますが、それは false に設定されているためです(それがシリアライゼーションにどのように影響するかはわかりません)。null
hasAppId
C# クライアントでは、常に 403 応答が返されます。値を設定しないこととデフォルト値を設定することの違いの背後にあるロジックはわかりません。これは、Java クライアントにすべての違いをもたらすようです。出力は常にバイナリ ストリームであるため、成功した Java メッセージが空の文字列でシリアル化されているのか、まったくシリアル化されていないのかはわかりません。
C# クライアントではIsRequired
、属性を true に設定しProtoMember
て強制的にシリアル化しようとしました。また、デフォルト値を null に設定して明示的に設定しようとしたので、いくつかの構成""
を試したと確信しています。値がシリアル化されている場所。また、ある時点でパラメーターを完全に削除して遊んでみましたが、C# で 403 エラーを回避できませんでした。ProtoBuf.ProtoIgnore
appId
シリアル化された文字列を Java から手動でコピーしようとしたところ、問題が解決したので、HTTP 要求の残りの部分が機能していることは確かであり、エラーはシリアル化されたオブジェクトまでたどることができます。
私のシリアライゼーションは単にこれです:
var clone = ProtoBuf.Serializer.DeepClone(request);
MemoryStream ms = new MemoryStream(2000);
ProtoBuf.Serializer.Serialize(ms, clone);
var bytearr = ms.ToArray();
string encodedData = Convert.ToBase64String(bytearr);
何が何をするのかよくわからないことは認めますDeepClone
。あり・なし両方試してみましたが…