我在App Engine中有以下java模型类:
public class Xyz ... {
@Persistent
private Set<Long> uvw;
}
在Java语言中使用空的 set uvw保存对象Xyz时,我得到一个"null“字段(如appengine数据存储查看器中所列)。当我尝试在Python中加载相同的对象时(通过remote_api),正如下面的python模型类所定义的:
class Xyz(db.Model):
uvw = db.ListProperty(int)
我得到一个"BadValueError: Property uvw is required“。
在Python语言中使用空的uvw列表保存同一类的另一个对象时,数据存储区查看器会打印一个"missing“字段。
显然,空列表存储处理在Java和Python之间是不同的,并导致“不兼容”的对象。
因此我的问题是:有没有办法:
或者关于如何在两种语言中处理空列表域的任何其他建议。
感谢您的回答!
发布于 2010-06-20 21:36:55
如果您为您的Python属性分配一个默认值,它应该可以工作:
uvw = db.ListProperty(int, default=[])
发布于 2010-06-17 03:23:15
我使用的是低级java api,所以我所做的可能会有所不同。但在将集合类型的数据结构保存到数据存储之前,我会将其转换为数据存储自然处理的数据结构。这主要包括字符串和ByteArrays。
听起来像是java应用程序引擎将空集解释为null值。python没有正确读取这个空值。您可以尝试将空集保存为字符串值"empty set“。然后让python检查数据存储是否包含该字符串值。如果它这样做了,它可以分配一个新的空集,如果不是,它可以将属性作为一个集读取。
发布于 2010-02-22 22:55:08
Java Set行为是因为Java的集合是引用类型,缺省情况下为null。
要实际创建一个空集,请像这样声明它:
@Persistent
private Set<Long> uvw = new HashSet<Long>();
或者在右侧使用Set
的其他实现。不过,HashSet
是最常用的集合类型。其他有趣的集合类型是两个线程安全的集合CopyOnWriteArraySet
和ConcurrentSkipListSet
;还有有序集合类型LinkedHashSet
和排序集合类型TreeSet
。
https://stackoverflow.com/questions/2311533
复制相似问题