当我尝试持久化二维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。此外,我不打算查询存储的对象。只是为了存储和检索它们。
答案 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 types和Collection
支持的java类型(包括ArrayList
)。但是,集合内的集合不是受支持的类型。
这些被称为多值属性并且有一个目的 - 集合的每个值都获得它自己的索引条目,因此查询实际上可以根据集合中的值来查找实体。
在您的情况下,您最好将2D列表的一个维度序列化为字节数组并将其存储在Blob
内,然后将所有blob存储为List<Blob>
。
答案 2 :(得分:1)
如果您没有查询,请将它们保留为json或其他文本格式。注意最大的实体大小。