Google app engine 间歇Base64任务转换错误
在使用Gson传递拉队列任务负载内的POJOJava对象时,我遇到了一个非常奇怪的情况。在不更改代码或任务有效负载内设置的POJO的情况下,这将随机成功或失败 这是我正在使用的代码:Google app engine 间歇Base64任务转换错误,google-app-engine,Google App Engine,在使用Gson传递拉队列任务负载内的POJOJava对象时,我遇到了一个非常奇怪的情况。在不更改代码或任务有效负载内设置的POJO的情况下,这将随机成功或失败 这是我正在使用的代码: PullQueueTaskPayLoad tqp = new PullQueueTaskPayLoad("id","name"); tqp.uploadURL = taskPayLoad.uploadURL; tqp.urls = taskPayLoad.urls; tqp.sliceQue
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);
Type GSON_Type=new-TypeToken(){}.getType();
byte[]b=new Base64().decodeBase64(leasedTask.getPayloadBase64().getBytes());
字符串有效载荷=新字符串(b);
logger.info(“即将转换有效负载:”+有效负载);
PullQueueTaskPayLoad=new Gson().fromJson(有效载荷,Gson_类型);
因此,从我所做的调试来看,当我解码有效负载字节时,问题似乎正在发生。在编码相同的POJO(使用不同的ID)时,我随机得到2个不同的解码有效负载字符串,如下所示:
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);
正确解码:
{“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:[“?”]}}},“上传URL”:http://3.linguabox0412.appspot.com/_ah/upload/AMmfu6YRjxX23Ks-yh-9AZs4-3I1p6hxrFd6d4ptxSQegUkQHN7y4hNZwX6u7PufIHJbwtsHLXFZJ5P-vs90mslZEOMw0T-amN2qhEOAj_6YdwuY50FXMi8/ALBNUaYAAAAAT7Towgs4M00M5RLI8xnEOMdIxouZzuGu/,“状态”:“进行中”,“操作”:“切片搜索和创建”}
解码错误:
{“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?W?????W?EU$?”和?GG???2?wV和?C)?7?B?6?W?B?gSe???u?d?d?6?S?4UV?d?e7%u和%F?d$F?F?d和vu6?F?F?F?F?vt1466?vt6?d?甦??GD?F?CuF?F?F?D?u?wt?4?C?W?'7FGW2?u?U52?&7F?%4?u?4T?E?5?TDR'
因此,当使用Gson将第二个字符串转换回POJO时,第二个字符串显然失败了。但我不明白为什么这种情况只在某些情况下发生,而在其他情况下不会发生。就我所见,它似乎总是发生在[“?”]字符串。我尝试用其他字符串替换和,但它没有改变任何东西。我认为这里发生的事情是负载是webSafe-base64编码的。实际上,这意味着为
-
和-
和-
和
和
交换+/code>。大多数base64库都有支持解码websafe base 64字符串
可能你在某一点遇到了这些字符中的一个,这就扼杀了解码
这里有一些关于
不过,警告一句:taskqueue实现实际上正在发送padding equals(=),您必须在解析之前手动转换它