【问题标题】:Reading object from Google Cloud Storage always returns null从 Google Cloud Storage 读取对象始终返回 null
【发布时间】:2015-02-06 07:02:48
【问题描述】:

我希望通过 GAE 将 blob 读/写到 GCS。但是,我面临一个非常奇怪的问题:

我使用以下方法将对象(HashMap)写入 GCS:

GcsOutputChannel outputChannel =
      gcsService.createOrReplace(fileName, GcsFileOptions.getDefaultInstance());

  ObjectOutputStream oout =
      new ObjectOutputStream(Channels.newOutputStream(outputChannel));
  oout.writeObject(content);
  oout.close();

现在,当我尝试读取同一个对象时,它总是返回 null!

GcsInputChannel readChannel = gcsService.openPrefetchingReadChannel(fileName, 0, BUFFER_SIZE);
  ObjectInputStream oin = new ObjectInputStream(Channels.newInputStream(readChannel));
  Object obj = oin.readObject();
  System.out.println("obj is " + obj); //this obj is null!!

我还可以看到使用 GCS 浏览器创建的对象并查看时间戳,并且它具有一定的大小。 在阅读之前,我可以获得该对象的元数据,它返回正常并且长度也正确!只是“readObject”返回 null! 尝试了其他对象序列化方法,但无济于事。

有趣的是,我能够将 String 作为 byte[] 写入存储桶并毫无问题地读回它。所以不要以为权限/配置有什么问题。

这发生在本地主机和生产环境中。

GAE Java 1.9.17 GCS appengine-gcs-client-0.4.4.jar google-api-services-storage-v1-rev26-1.19.1.jar

有人知道哪里出了问题吗?

谢谢,阿西姆

【问题讨论】:

  • 写完后你的代码中是否有outputChannel.waitForOutstandingWrites()
  • 嗨,Igor,不,我的代码中没有 waitForOutstandingWrites()。

标签: google-app-engine google-cloud-storage


【解决方案1】:

您还需要通过调用outputChannel.waitForOutstandingWrites() 将您的写入刷新到 GCS,例如:

GcsOutputChannel outputChannel =
  gcsService.createOrReplace(fileName, GcsFileOptions.getDefaultInstance());

ObjectOutputStream oout =
  new ObjectOutputStream(Channels.newOutputStream(outputChannel));
oout.writeObject(content);
outputChannel.waitForOutstandingWrites()

【讨论】:

  • 谢谢。我添加了 waitForOutstandingWrites() 行,但仍然没有运气。
  • 您确定没有将null 写入此文件吗?
  • 哇,谢谢你的提示。我重新检查并发现我之前创建的哈希图有问题: HashMap data = (HashMap) new HashMap().put("somekey", "value");切换到好的 ol HashMap data = new HashMap(); data.put("key", "value");这行得通!
  • 和 waitForOutstandingWrites() 不是必需的。即使没有它也可以工作!显然是因为对象为空!
  • 无论如何你都需要这个waitForOutstandingWrites(),否则一半时间你会得到错误/损坏的文件。如果忘记了这个电话,我总是会在意想不到的时刻遇到类似的问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2020-04-25
  • 2019-11-17
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多