Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
多个Hibernate对象的Jackson Json序列化_Json_Hibernate_Serialization_Jackson_Deserialization - Fatal编程技术网

多个Hibernate对象的Jackson Json序列化

多个Hibernate对象的Jackson Json序列化,json,hibernate,serialization,jackson,deserialization,Json,Hibernate,Serialization,Jackson,Deserialization,我使用Hibernate3编写了以下代码 List queryResult = session.createQuery("SELECT A, B from A, B where A.id = B.id"); for (Object o: queryResult) { Object[] array = (Objec[]) o; A a = (A) array[0]; B b = (B) array[1]; //do work } 这很好,因为我直接对hib

我使用Hibernate3编写了以下代码

List queryResult = session.createQuery("SELECT A, B from A, B where A.id = B.id");
for (Object o: queryResult) {
     Object[] array = (Objec[]) o;
     A a = (A) array[0];
     B b = (B) array[1];
     //do work
}
这很好,因为我直接对hibernate查询结果进行操作。但是,我还想将queryResult序列化为字符串,以便以后使用。我使用Jackson的json库尝试了以下操作:

ObjectMapper m = new ObjectMapper()
final String queryResultString = m.writeValueAsString(queryResult);
然后,稍后我尝试将Json中的字符串读取并反序列化回Hibernate查询结果,这时我遇到了麻烦。读取代码:

List r = m.readValue(queryResultString, List.class);
for (Object o: r) {
     Object[] array = (Objec[]) o;
     A a = (A) array[0];
     B b = (B) array[1];
     //do work
}
对象[]的强制转换抱怨无法将ArrayList强制转换为对象数组


我尝试使用jackson hibernate模块,但也没用。所以我的问题是:a)使用JSon序列化的正确方法是什么?b) 为什么Jackson将其反序列化到arraylist

假设

当使用jackson序列化时,您的列表将类似于: [[A_项目,B_项目],[A_项目2,B_项目2],…[A_项目n,B_项目n]] 为什么?因为您有一个列表列表或数组数组(如果愿意的话)(第二个列表将始终有两个元素,a和B)

问题

您的列表未键入。因此jackson将json流反序列化为列表列表。 因为当jackson遇到数组结构并且不知道反序列化到哪种类型时,它将反序列化到列表而不是数组

解决方案

1) 与使用数组不同,您使用的是列表,因为jackson默认情况下将反序列化为列表而不是数组(这就是为什么会出现classcast异常)

2) 如果您使用的是Java5+(这意味着您可以使用泛型),那么您可以使用jackson TypeReference类

List listOfLists = mapper.readValue(queryResultString, new TypeReference<List<Object[]>>() {});
编辑
您有一个forEach循环,我断定您在Java6+下,然后切换到Genson;)

2)不起作用--它确实传递了Object[]强制转换语句,但对象(A)数组[0]的实际强制转换失败,出现异常:无法将LinkedHashMap强制转换为A。3)Genson不起作用,因为它无法序列化A。1)您的A和B是复杂类型,默认情况下Jackson不知道要反序列化的类型。这就是他反序列化到地图的原因。2) 你能展示一下你的飞机是什么样子吗?我很惊讶序列化失败了……A和B是hibernate对象——即使用hibernate查询mysql返回的对象。我考虑到序列化可能会丢失类信息,并尝试为对象映射器添加hibernateModule,但也不起作用。
List r = new Genson().deserialize(queryResultString, List.class);
for (Object o: r) {
 Object[] array = (Objec[]) o;
    // it works!
    A a = (A) array[0];
 }