0

在使用 Gson 的 Pull Queue 任务的有效负载中传递 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/本体#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? 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?F֤֧f?D??u?wt?4?C$?W?"?'7FGW2#?$ ???$?u$U52"?&7F???#?%4Ĕ4U?4T$4???E?5$TDR'

因此,当使用 Gson 将其转换回 POJO 时,第二个字符串显然会失败。但我不明白为什么这只发生在某些情况下而不是其他情况下。就我所见,它似乎总是发生在 ["?"] 字符串之后。我尝试替换和?与其他字符串,但它没有改变任何东西。

4

1 回答 1

2

我认为这里发生的是有效负载是 webSafe-base64 编码的。+在实践中,这意味着将and/与 and交换=-and _and .。大多数 base64 库都支持解码 websafe base 64 字符串。

可能您在某个时刻遇到了这些字符之一,这会破坏解码。

这是有关WebSafeBase64的一些信息

不过,请注意:任务队列实现实际上是发送填充等于(=),您必须在解析之前手动转换。

于 2012-06-12T09:07:35.663 回答