Gson序列化POJO的ArrayList时遇到麻烦

我一直在计划使用simpleXML来处理序列化需求,但是我想我会尝试使用JSON来学习新的东西。

这是我正在使用的代码尝试使用Gson 1.7.1序列化testingPOJO的ArrayList。

注意:我删除了string“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 

对我的新手来说,这看起来是正确的。 只有DeSerialized对象列表包含基本对象,而不是TestObject的I序列化。 任何人都可以向我解释什么,如果有什么,我可以做这个工作?

编辑:

更正testing:感谢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 --- 

EDIT2:

我真的不知道为什么,但是当我用一个ArrayListreplace了我的TestObject中embedded的简单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 --- 

您需要提供关于您正在使用的List的特定通用types(或您使用的任何通用types)的Gson信息。 特别是在反序列化JSON时,它需要这些信息能够确定应该反序列化每个数组元素的types的对象。

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

这在Gson用户指南中有logging 。