2

ProtoBuf シリアル化されたメッセージを介して、Google と通信している動作中の Java クライアントがあります。現在、そのクライアントを C# に変換しようとしています。

パラメータがオプションの文字列である.protoファイルがあります。appIdprotobuf-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 に設定されているためです(それがシリアライゼーションにどのように影響するかはわかりません)。nullhasAppId

C# クライアントでは、常に 403 応答が返されます。値を設定しないこととデフォルト値を設定することの違いの背後にあるロジックはわかりません。これは、Java クライアントにすべての違いをもたらすようです。出力は常にバイナリ ストリームであるため、成功した Java メッセージが空の文字列でシリアル化されているのか、まったくシリアル化されていないのかはわかりません。

C# クライアントではIsRequired、属性を true に設定しProtoMemberて強制的にシリアル化しようとしました。また、デフォルト値を null に設定して明示的に設定しようとしたので、いくつかの構成""を試したと確信しています。値がシリアル化されている場所。また、ある時点でパラメーターを完全に削除して遊んでみましたが、C# で 403 エラーを回避できませんでした。ProtoBuf.ProtoIgnoreappId

シリアル化された文字列を 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。あり・なし両方試してみましたが…

4

1 に答える 1

1

強制的に除外したいようです。最初に試すには、コード生成で「detectmissing」オプションを使用してみてください。これはIDEとコマンドラインから可能ですが、異なる方法です(使用しているものを教えてください。さらに追加します)。

別の同様のオプションは、(部分クラスで)を追加することbool {memberName}Specified {get;set;}です。私が見ている、デフォルトの空の文字列を含む奇妙な既存のオープンレポートがあります。

于 2010-05-11T12:06:50.457 に答える