在使用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(具有不同的Ids)时,我随机获得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。组织/本体#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 /”, “状态”: “IN_PROGRESS”, “动作”: “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 /本体#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乙6 ??????W¯¯14 B ??? GSE ????” ??????üU'd d ?? 6 S ?? 4UV d E7%U&安培;%F%F d $ ??? $&安培;????vu6 $ FF ????如v ?? 6 6դVT d ???ģ??&安培;???????????d FDֵ6%苏?? GD ???? F ??? $ V CUF $ F F֤֧˚Fd ??ù重量????4 C $ W“???7FGW2#$ $ ??? U $ U52" &安培;???????7F#%4Ĕ4U4T $ 4 ??? E(5)$ TDR'
因此,当使用Gson将其转换回POJO时,第二个字符串显然会失败。但我不明白为什么只在某些情况下发生这种情况而不是其他情况。对于我所看到的,似乎总是发生在[“?”]字符串之后。我试过替换和?与其他字符串,但它没有改变任何东西。
答案 0 :(得分:2)
我认为这里发生的是有效载荷是webSafe-base64编码的。实际上,这意味着为+
和/
以及=
交换-
和_
以及.
。大多数base64库都支持解码websafe base 64字符串。
可能你在某个时刻遇到其中一个字符,这会导致解码。
的一些信息警告提示:taskqueue实现实际上是在解析之前发送padding equals(=),你必须手动转换。