Java 在应用程序引擎上存储二进制数据的最有效方法?
我正在使用AppEngine、云端点和Objectify。我想存储一个二进制文件(大约2 kB),其中可能包含二进制文件(图像文件)、字符串和XML。无需在App Engine上列出或索引内容。它应该只存储在实体旁边 我知道我可以,但我不想把这些信息存储在地面军事系统上 我在服务器端使用了字节数组,Objectify可以很好地保持,但我意识到云端点会将其转换为客户端的字符串,我认为这不是很有效,因为我需要首先将客户端生成的二进制文件(图像文件)转换为字符串,以便云端点将其转换回字节[] 我尝试在客户端使用字节数组,云端点无法处理它,因为它“包含无效字符”,例如空格。当我对其进行URL编码时,端点将%作为非法字符进行投诉。所以这似乎不是谷歌计划使用的方式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可以很好地保持,但我意识到云端点会将其转换为客户端的字符串,我认为这不是很有效,因为我需要首先将客户端生成的二进制文件(图像文件)转换为字符串,以便云端点将其转换回字节[] 我尝试在
如果存在可以通过端点传输并由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));
}
}