J'avais prévu d'utiliser simpleXML pour mes besoins en sérialisation, mais j'ai décidé d'essayer JSON pour apprendre quelque chose de nouveau.
C'est le code que j'utilise pour essayer de sérialiser une ArrayList de POJO de test à l'aide de Gson 1.7.1.
Remarque: j'ai supprimé le lecteur/graveur pour une chaîne "s" afin de simplifier le code.
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) );
}
}
Voici la sortie que je reçois:
[{"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
Pour mes débutants, cela semble correct. Seulement, la liste d'objets DeSerialized contient des objets de base, plutôt que ceux de TestObject I sérialisés. Quelqu'un peut-il m'expliquer s'il vous plaît quoi que ce soit que je puisse faire pour que cela fonctionne?
EDIT:
Corrigé pour tester: Merci à 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 ---");
}
}
sortie:
--- 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:
Honnêtement, je ne sais pas pourquoi, mais lorsque j'ai remplacé le simple String [] incorporé dans mon TestObject par un ArrayList, la sérialisation a commencé correctement.
--- 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 ---
Vous devez donner à Gson des informations sur le type générique spécifique de List
que vous utilisez (ou sur tout type générique que vous utilisez avec). En particulier lors de la désérialisation de JSON, il a besoin de ces informations pour pouvoir déterminer le type d'objet pour lequel il doit désérialiser chaque élément du tableau.
Type listOfTestObject = new TypeToken<List<TestObject>>(){}.getType();
String s = gson.toJson(list, listOfTestObject);
List<TestObject> list2 = gson.fromJson(s, listOfTestObject);
Ceci est documenté dans le Guide de l'utilisateur Gson .