Gson 序列化 POJO 的数组列表的问题

我一直计划使用 simpleXML 来满足我的序列化需求,但是我认为我应该尝试使用 JSON 来学习一些新的东西。

这是我使用 Gson1.7.1来尝试和序列化测试 POJO 的 ArrayList 的代码。

注意: 为了简化代码,我删除了字符串“ s”的 Reader/Writers。

package test;


import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


import com.google.gson.Gson;


public class TestGsonSerialDeserialList {
public static void main(String[] args) throws IOException{
Gson gson = new Gson();


//Make Serial
String s;
List<TestObject> list = Collections.synchronizedList(new ArrayList<TestObject>() );
list.add(new TestObject());
list.add(new TestObject());


s = gson.toJson(list, ArrayList.class);
System.out.println(s);


//Eat Serial
List<TestObject> list2 = Collections.synchronizedList(gson.fromJson(s, ArrayList.class) );
System.out.println(list2.get(0) );
System.out.println(list2.get(1) );
}
}

下面是我得到的输出:

[{"objectID":1,"i1":12345,"name":"abcdefg","s":["a","b","c"]},{"objectID":2,"i1":12345,"name":"abcdefg","s":["a","b","c"]}]
java.lang.Object@5c74c3aa
java.lang.Object@75d9fd51

在我的菜鸟眼里,这看起来是正确的。只是,DeSerialization 对象列表包含基本对象,而不是我序列化的 TestObject。有没有人能给我解释一下,如果有的话,我该怎么做才能让这事成功?

编辑:

更正测试: 感谢 ColinD

package test;


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;


public class TestGsonSerialDeserialList {
public static void main(String[] args) throws IOException{
System.out.println("--- Serialize / Deserialize Started ---");
String fileName = "json\\testList.json";


Gson gson = new Gson();
Type listOfTestObject = new TypeToken<List<TestObject>>(){}.getType();


//Make Serial
Writer osWriter = new OutputStreamWriter( new FileOutputStream(fileName));
List<TestObject> list = Collections.synchronizedList(new ArrayList<TestObject>() );
list.add(new TestObject());
list.add(new TestObject());
list.add(new TestObject());
list.add(new TestObject());
gson.toJson(list, osWriter);
osWriter.close();




//Eat Serial
Reader isReader = new InputStreamReader( new FileInputStream((fileName) ) );
List<TestObject> list2 = Collections.synchronizedList(
(List<TestObject>)gson.fromJson(isReader, listOfTestObject)
);
isReader.close();
System.out.println(list2.get(0) );
System.out.println(list2.get(1) );
System.out.println(list2.get(2) );
System.out.println(list2.get(3) );
System.out.println("--- Serialize / Deserialize Ended ---");
}
}

产出:

--- Serialize / Deserialize Started ---
ID#: 1, i1: 12345, name: abcdefg, s[]: [Ljava.lang.String;@95c083
ID#: 2, i1: 12345, name: abcdefg, s[]: [Ljava.lang.String;@6791d8c1
ID#: 3, i1: 12345, name: abcdefg, s[]: [Ljava.lang.String;@182d9c06
ID#: 4, i1: 12345, name: abcdefg, s[]: [Ljava.lang.String;@5a5e5a50
--- Serialize / Deserialize Ended ---

编辑2:

老实说,我不知道为什么,但是当我用 ArrayList 替换了 TestObject 中嵌入的简单 String []时,它就开始正确地序列化了。

--- Serialize / Deserialize Started ---
ID#: 1, i1: 12345, name: abcdefg, s[]: [a, b, c]
ID#: 2, i1: 12345, name: abcdefg, s[]: [a, b, c]
ID#: 3, i1: 12345, name: abcdefg, s[]: [a, b, c]
ID#: 4, i1: 12345, name: abcdefg, s[]: [a, b, c]
--- Serialize / Deserialize Ended ---
86997 次浏览

您需要向 Gson 提供您正在使用的特定泛型类型 List的信息(或与之一起使用的任何泛型类型)。特别是在反序列化 JSON 时,它需要该信息来确定应该将每个数组元素反序列化到哪种类型的对象。

Type listOfTestObject = new TypeToken<List<TestObject>>(){}.getType();
String s = gson.toJson(list, listOfTestObject);
List<TestObject> list2 = gson.fromJson(s, listOfTestObject);

这在 Gson 用户指南中有记载。