Problemas con Gson serializando una ArrayList de POJO’s

Había estado planeando usar SimpleXML para mis necesidades de serialización, pero pensé que probaría JSON, para aprender algo nuevo.

Este es el código que estoy usando para tratar de serializar un ArrayList de prueba POJO usando Gson 1.7.1.

Nota: eliminé el Reader / Writers para una cadena “s” para simplificar el código.

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 list = Collections.synchronizedList(new ArrayList() ); list.add(new TestObject()); list.add(new TestObject()); s = gson.toJson(list, ArrayList.class); System.out.println(s); //Eat Serial List list2 = Collections.synchronizedList(gson.fromJson(s, ArrayList.class) ); System.out.println(list2.get(0) ); System.out.println(list2.get(1) ); } } 

Aquí está la salida que obtengo:

 [{"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 

Para mis ojos de novato esto parece correcto. Solo que la lista de objetos Deserializados contiene Objetos básicos, en lugar de serializar el TestObject. ¿Alguien puede explicarme qué puedo hacer para hacer que esto funcione?

EDITAR:

Corregido para probar: gracias a 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>(){}.getType(); //Make Serial Writer osWriter = new OutputStreamWriter( new FileOutputStream(fileName)); List list = Collections.synchronizedList(new ArrayList() ); 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 list2 = Collections.synchronizedList( (List)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 ---"); } } 

salida:

 --- 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:

Honestamente, no sé por qué, pero cuando reemplacé el simple String [] incrustado en mi TestObject con una ArrayList, comenzó a serializarse correctamente.

 --- 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 --- 

Debe proporcionar información de Gson sobre el tipo genérico específico de la List que está utilizando (o cualquier tipo genérico que use con ella). Particularmente cuando se deserializa JSON, necesita esa información para poder determinar a qué tipo de objeto debe deserializar cada elemento de la matriz.

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

Esto está documentado en la guía de usuario de Gson .