【问题标题】:Most efficient way to store binary data on App Engine?在 App Engine 上存储二进制数据的最有效方法是什么?
【发布时间】:2014-08-25 20:56:18
【问题描述】:

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

我知道我可以,但我不想在 GCS 上存储这些信息。

我使用了一个字节数组服务器端,Objectify 可以很好地保留它,但我意识到 Cloud Endpoints 将它转换为客户端的字符串,我认为这不是很有效,因为我需要转换客户端生成的二进制文件 ( image 文件)首先转换为 String,以便 Cloud Endpoints 将其转换回 byte[]。

我尝试使用字节数组客户端,Cloud Endpoints 无法处理它,因为它“包含无效字符”,例如空格。当我对其进行 URLEncode 时,Endpoints 抱怨 % 为非法字符。所以这似乎不是 Google 计划使用的方式。

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

【问题讨论】:

    标签: java google-app-engine google-cloud-endpoints objectify


    【解决方案1】:

    通过 Cloud Endpoints 发送二进制数据 into a Base64 String 时如何使用编码?无需更改存储方面的任何内容,它将保持为byte[]。

    只需将您的byte[] 放在一个专用类中并为其声明一个@ApiTransformer:

    @ApiTransformer(BinaryDataOrStringOrXMLTransformer.class)
    public class BinaryDataOrStringOrXML {
      private final byte[] data;
      //add constructor, getters and setters
    }
    

    变压器代码:

    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));
      }
    }
    

    您可能需要测试 getUrlDecoder() 和 getDecoder(),我不确定哪一个适用于 Cloud Endpoints。

    在客户端,您还需要对 Base64 进行解码。如果您使用的是 Android,那将非常容易。在 javascript 中它可能会更复杂一些,但那里有一些有用的库。

    【讨论】:

    • 非常感谢,我将此答案标记为正确。我以前试过这个,但由于你和我的代码有一点点差异,它没有用:你使用了 byte[],而我使用了 Byte[]。使用 objectify,一个 byte[] 被持久化为二进制,而一个 Byte[] 被持久化为一个字符数组,关键就在这里。另请参阅:code.google.com/p/objectify-appengine/wiki/Entities#byte[]
    猜你喜欢
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 2012-05-26
    • 2013-02-05
    • 2010-09-24
    相关资源
    最近更新 更多