11

我在 App Engine 中有以下 java 模型类:

public class Xyz ... {
    @Persistent
    private Set<Long> uvw;
}

在 Java 中使用uvw保存对象Xyz时,我得到一个“ null ”字段(如 appengine 数据存储查看器中所列)。当我尝试在 Python 中加载相同的对象时(通过 remote_api),由以下 python 模型类定义:

class Xyz(db.Model):
    uvw = db.ListProperty(int)

我得到一个“ BadValueError: Property uvw is required ”。

在 Python 中使用空的uvw列表保存同一类的另一个对象时,Datastore 查看器会打印一个“缺失”字段。

显然空列表存储处理在 Java 和 Python 之间有所不同,并导致“不兼容”对象。

因此我的问题是:有没有办法:

  • 强制 Java 将空列表存储为“缺失”字段,
  • 加载对象时强制Python优雅地接受“null”列表作为空列表?

或有关如何处理两种语言的空列表字段的任何其他建议。

感谢您的回答!

4

4 回答 4

2

如果您为 Python 属性分配默认值,它应该可以工作:

uvw = db.ListProperty(int, default=[])
于 2010-06-20T13:36:55.383 回答
1

我使用低级 java api,所以也许我在做的会有所不同。但在将集合类型的数据结构保存到数据存储之前,我将其转换为数据存储自然处理的内容。这将主要包括字符串和字节数组。

听起来 java 应用程序引擎将空集解释为空值。并且 python 没有正确读取这个空值。您可以尝试将空集保存为字符串值“空集”。然后让 python 检查数据存储是否包含该字符串值。如果是,它可以分配一个新的空集,如果不是,它可以将属性读取为一个集合。

于 2010-06-16T19:23:14.533 回答
0

Java Set 行为是因为 Java 的 Collections 是引用类型,默认为 null。

要实际创建一个空集,请像这样声明它:

@Persistent
private Set<Long> uvw = new HashSet<Long>();

Set或在右侧 使用其他一些实现。HashSet不过,它是最常用的 Set 类型。其他有趣的集合类型是两个线程安全的 SetCopyOnWriteArraySetConcurrentSkipListSet; 还有 Ordered Set 类型LinkedHashSet和 Sorted Set 类型TreeSet

于 2010-02-22T14:55:07.907 回答
0

它可能对你有用

uvw = db.ListProperty(int, default=[])

它是缩短它的最评论方式......

于 2018-07-15T14:16:32.880 回答