0

Gson を使用してプル キュー タスクのペイロード内で POJO Java オブジェクトを渡すと、非常に奇妙な状況が発生します。コードを変更したり、タスクのペイロード内に設定されている POJO を変更したりしなければ、これはランダムに成功または失敗します。

これは私が使用しているコードです:

   PullQueueTaskPayLoad tqp = new PullQueueTaskPayLoad("id","name");
   tqp.uploadURL = taskPayLoad.uploadURL;
   tqp.urls = taskPayLoad.urls;
   tqp.sliceQueryParameter = taskPayLoad.sliceQueryParameter;
   TaskOptions task = TaskOptions.Builder.withMethod(TaskOptions.Method.PULL);
   task.payload(new Gson().toJson(tqp));
   q.add(task);

次に、外部キュー コンシューマーを使用して、次のように POJO を取得します。

    Type GSON_TYPE = new TypeToken<PullQueueTaskPayLoad>() {}.getType();
    byte[] b = new Base64().decodeBase64(leasedTask.getPayloadBase64().getBytes());
    String payload = new String(b);
    logger.info("About to convert payload: "+payload);
    PullQueueTaskPayLoad taskpayload = new Gson().fromJson(payload, GSON_TYPE);

私が行ったデバッグから、ペイロードバイトをデコードしているときに問題が発生しているようです。同じ POJO を (異なる ID で) エンコードしているときに、次のように 2 つの異なるデコードされたペイロード文字列をランダムに取得します。

正しいデコード:

{"id":"1786024566","sliceQueryParameter": {"queryId":786024566,"sliceStart":-1,"sliceNumber":1,"params":{"DefaultAnnotation":{"http://www. slicepedia.org/ontology#hasNumberOfBulletPoints_SIGN":["\u003d"],"http://www.slicepedia.org/ontology#hasNumberOfBulletPoints":["0"],"http://www.slicepedia.org/ontology #hasNumberOfTokens":["80"],"http://www.slicepedia.org/ontology#hasNumberOfTokens_SIGN":["\u003e"]},"VG":{"http://www.slicepedia.org/ ontology#hastense":["?"],"http://www.slicepedia.org/ontology#hasroot":["?"]}}},"uploadURL":"http://3.linguabox0412.appspot .com/_ah/upload/AMmfu6YRjxX23Ks-yh-9AZs4-3I1p6hxrFd6d4ptxSQegUkQHN7y4hNZwX6u7PufIHJbwtsHLXFZJ5P-vs90mslZEOMw0T-amN2qhEOAj_6YdwuY50FXMi8/ALBNUaYAAAAAT7Towgs4M00M5RLI8xnEOMdIxouZzuGu/","status":"IN_PROGRESS","action":"SLICE_SEARCH_AND_CREATE"}

正しくないデコード:

{"id":"1-1968382407","sliceQueryParameter":{"queryId":-1968382407,"sliceStart":-1,"sliceNumber":1,"params":{"DefaultAnnotation":{"http:/ /www.slicepedia.org/ontology#hasNumberOfBulletPoints_SIGN":["\u003d"],"http://www.slicepedia.org/ontology#hasNumberOfBulletPoints":["0"],"http://www.slicepedia. org/ontology#hasNumberOfTokens":["80"],"http://www.slicepedia.org/ontology#hasNumberOfTokens_SIGN":["\u003e"]},"VG":{"http://www.slicepedia .org/ontology#hastense":["?K??????~?X?\YXK??????H?\?????%?????'W?? EU$?#?&?GG???2?Ɩ?wV&??C"?7?B?6??????W??B???gSe????'u?U'd ?D??6?S??4UV?D?e7?%U?&%F%f?D?$???$&vu6?fF$????EG?v??6?6・vt?D? ??G??&D?fd⋅6%?甦??GD????F???$?V?CuF?$?F?Facref?D??u?wt?4?C$?W?"?'7FGW2#?$ ???$?u$U52"?&7F???#?%4Ĕ4U?4T$4???E?5$TDR'

したがって、Gson を使用して POJO に戻すと、2 番目の文字列は明らかに失敗します。しかし、これが一部のケースでのみ発生し、他のケースでは発生しない理由がわかりません。私が見た限りでは、常に ["?"] 文字列の後に発生するようです。と ? を交換してみました。他の文字列を使用しましたが、何も変わりませんでした。

4

1 に答える 1

2

ここで起こっていることは、ペイロードが webSafe-base64 でエンコードされていることだと思います。実際には、これは と と と を交換する+ことを/意味=します。ほとんどの base64 ライブラリは、websafe base 64 文字列のデコードをネイティブでサポートしています。-_.

おそらく、特定の時点でこれらの文字の 1 つに遭遇しており、それがデコードを停止させている可能性があります。

ここにWebSafeBase64に関する情報があります

ただし、警告の言葉: taskqueue の実装は実際にはパディング等号 (=) を送信しており、解析する前に手動で変換する必要があります。

于 2012-06-12T09:07:35.663 に答える