Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在应用程序引擎上存储二进制数据的最有效方法?_Java_Google App Engine_Google Cloud Endpoints_Objectify - Fatal编程技术网

Java 在应用程序引擎上存储二进制数据的最有效方法?

Java 在应用程序引擎上存储二进制数据的最有效方法?,java,google-app-engine,google-cloud-endpoints,objectify,Java,Google App Engine,Google Cloud Endpoints,Objectify,我正在使用AppEngine、云端点和Objectify。我想存储一个二进制文件(大约2 kB),其中可能包含二进制文件(图像文件)、字符串和XML。无需在App Engine上列出或索引内容。它应该只存储在实体旁边 我知道我可以,但我不想把这些信息存储在地面军事系统上 我在服务器端使用了字节数组,Objectify可以很好地保持,但我意识到云端点会将其转换为客户端的字符串,我认为这不是很有效,因为我需要首先将客户端生成的二进制文件(图像文件)转换为字符串,以便云端点将其转换回字节[] 我尝试在

我正在使用AppEngine、云端点和Objectify。我想存储一个二进制文件(大约2 kB),其中可能包含二进制文件(图像文件)、字符串和XML。无需在App Engine上列出或索引内容。它应该只存储在实体旁边

我知道我可以,但我不想把这些信息存储在地面军事系统上

我在服务器端使用了字节数组,Objectify可以很好地保持,但我意识到云端点会将其转换为客户端的字符串,我认为这不是很有效,因为我需要首先将客户端生成的二进制文件(图像文件)转换为字符串,以便云端点将其转换回字节[]

我尝试在客户端使用字节数组,云端点无法处理它,因为它“包含无效字符”,例如空格。当我对其进行URL编码时,端点将%作为非法字符进行投诉。所以这似乎不是谷歌计划使用的方式


如果存在可以通过端点传输并由Objectify持久化的数据类型,以避免双方的低效转换,并且可以承载二进制文件和文本字符串,有什么建议或经验吗?

在通过云端点发送二进制数据时,如何使用编码?无需更改存储端的任何内容,它将保持为
字节[]

只需将您的
字节[]
放入一个专用类中,并为其声明一个:

变压器代码:

public class BinaryDataOrStringOrXMLTransformerimplements Transformer<BinaryDataOrStringOrXML, String> {
  public String transformTo(BinaryDataOrStringOrXML in) {
    return Base64.getEncoder().encodeToString(in.getData());
  }

  public BinaryDataOrStringOrXML transformFrom(String in) {
    return new BinaryDataOrStringOrXML(Base64.getDecoder().decode(in));
  }
}
公共类BinaryDataOrStringOrXMLTransformerimplements Transformer{
公共字符串transformTo(二进制数据或字符串XML格式){
返回Base64.getEncoder().encodeToString(在.getData()中);
}
public BinaryDataOrStringOrXML transformFrom(字符串输入){
返回新的BinaryDataOrStringOrXML(Base64.getDecoder().decode(in));
}
}
您可能需要测试
geturldecker()
getDecoder()
,我不确定哪一个可以用于云端点


在客户端,您还需要解码Base64。如果你使用安卓系统,那将非常容易。在javascript中,它可能有点复杂,但是有一些有用的库。

非常感谢,我将这个答案标记为正确。我以前尝试过这个方法,但由于您和我的代码中有一个微小的差异,所以它不起作用:您使用的是byte[],而我使用的是byte[]。使用objectify,字节[]作为二进制持久化,而字节[]作为字符数组持久化,关键就在这里。另见此处:
public class BinaryDataOrStringOrXMLTransformerimplements Transformer<BinaryDataOrStringOrXML, String> {
  public String transformTo(BinaryDataOrStringOrXML in) {
    return Base64.getEncoder().encodeToString(in.getData());
  }

  public BinaryDataOrStringOrXML transformFrom(String in) {
    return new BinaryDataOrStringOrXML(Base64.getDecoder().decode(in));
  }
}