Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
应用程序引擎数据存储中的空列表:Java vs Python_Java_Python_Google App Engine_Datanucleus - Fatal编程技术网

应用程序引擎数据存储中的空列表:Java vs Python

应用程序引擎数据存储中的空列表:Java vs Python,java,python,google-app-engine,datanucleus,Java,Python,Google App Engine,Datanucleus,我在App Engine中有以下java模型类: public class Xyz ... { @Persistent private Set<Long> uvw; } 我得到一个“BadValueError:需要属性uvw” 在Python中使用空uvw列表保存同一类的另一个对象时,数据存储查看器会打印一个“缺少的”字段 显然,空列表存储处理在Java和Python之间有所不同,并导致对象“不兼容” 因此,我的问题是:有没有办法: 强制Java将空列表存储为“缺

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

public class Xyz ... {
    @Persistent
    private Set<Long> uvw;
}
我得到一个“BadValueError:需要属性uvw”

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

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

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

  • 强制Java将空列表存储为“缺少”字段
  • 在加载对象时,强制Python优雅地接受“null”列表作为空列表
或者关于如何处理两种语言中的空列表字段的任何其他建议


谢谢你的回答

Java集合的行为是因为Java的集合是引用类型,默认为null

要实际创建空集,请按如下方式声明:

@Persistent
private Set<Long> uvw = new HashSet<Long>();
@Persistent
私有集uvw=新HashSet();

或者在右侧使用其他的实现。是最常用的集合类型。其他有趣的集合类型是两个线程安全集合和;还有排序集类型和排序集类型。

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


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

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

uvw = db.ListProperty(int, default=[])
这可能对你有用

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

这是最简短的注释方式…

谢谢,但是当我将对象保存到数据存储时,集合是空的,而不是空的(我的代码不清楚,我应该在存储对象之前指定集合是空的哈希集)。这里的诀窍是appengine数据存储层似乎在存储时将空集转换为“null”值,而我看不到对这种行为的任何控制。@IOranger:啊,好的。我本来打算删除这个答案,但我会把它留在这里,这样以后就不会有人过来说同样的话了。
uvw = db.ListProperty(int, default=[])