Google App Engine阵列列表不是受支持的属性类型

时间:2013-10-07 15:04:15

标签: java arrays google-app-engine collections

当我尝试持久化二维ArrayList时,我收到以下错误:

java.lang.IllegalArgumentException: cng_content: java.util.ArrayList is not a supported property type.

我正在使用两个数组列表构建矩阵的表示,并尝试将其持久保存到数据存储中。

    Key cngKey = KeyFactory.createKey("CNG", jsonCNG.cNGID);
    Entity cngEntity = new Entity("CNG", cngKey);
    cngEntity.setProperty("cng_name", jsonCNG.cNGName);
    cngEntity.setProperty("cng_type", jsonCNG.cNGType);
    cngEntity.setProperty("cng_content", cng);

在代码片段中,cng的类型为:

ArrayList<ArrayList<String>>

我最初使用

ArrayList<HashMap<Byte,Boolean>>

作为对象的类型。但是,发现GAE数据存储区不支持HashMaps。此外,我不打算查询存储的对象。只是为了存储和检索它们。

3 个答案:

答案 0 :(得分:2)

使用EmbeddedEntity,它可以存储为您实体的属性。由于您只使用2D,因此将每个数组设置为EmbeddedEntity上的属性,其中键是数字,但以字符串格式表示,如“1”,“2”,“3”。

更具体地说:

Entity e = new Entity("2d");
EmbeddedEntity ee = new EmbeddedEntity();

ArrayList<String> x = new ArrayList<String>();
// add stuff to x

ArrayList<String> y = new ArrayList<String>();
// add stuff to y

ArrayList<String> z = new ArrayList<String>();
// add stuff to z

ee.setProperty("1", x);
ee.setProperty("2", y);
ee.setProperty("3", z);
e.setProperty("2dArray", ee);

我在没有测试时键入了这个,因此可能会出现语法错误

答案 1 :(得分:1)

setProperty(name, value)方法需要supported java typesCollection支持的java类型(包括ArrayList)。但是,集合内的集合不是受支持的类型。

这些被称为多值属性并且有一个目的 - 集合的每个值都获得它自己的索引条目,因此查询实际上可以根据集合中的值来查找实体。

在您的情况下,您最好将2D列表的一个维度序列化为字节数组并将其存储在Blob内,然后将所有blob存储为List<Blob>

答案 2 :(得分:1)

如果您没有查询,请将它们保留为json或其他文本格式。注意最大的实体大小。