Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trouble with Gson serializing an ArrayList of POJO's

I had been planning on using simpleXML for my serialization needs, but figured I would try JSON out, to learn something new.

This is the code I am using to try and serialize an ArrayList of test POJO's using Gson 1.7.1.

Note: I removed the Reader/Writers for a String "s" to simplify the 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) );     } } 

Here is the output I get:

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

To my newbie eyes this looks correct. Only, the DeSerialized list of objects contains basic Objects, rather then the TestObject's I serialized. Can anyone please explain to me what, if anything, I can do to make this work?

EDIT:

Corrected to test: Thanks to 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 ---");     } } 

output:

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

I honestly don't know why, but when I replaced the simple String[] embedded in my TestObject with an ArrayList, it started serializing correctly.

--- 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 --- 
like image 281
RogueDeus Avatar asked Apr 28 '11 03:04

RogueDeus


People also ask

Can ArrayList be serialized?

Serializing ArrayList: In Java, the ArrayList class implements a Serializable interface by default i.e., ArrayList is by default serialized. We can just use the ObjectOutputStream directly to serialize it.

Does GSON ignore extra fields?

As you can see, Gson will ignore the unknown fields and simply match the fields that it's able to.

Does GSON ignore transient fields?

By default, GSON excludes transient and static fields from the serialization/deserialization process.

How do I use GSON to serialize?

Serialization in the context of Gson means converting a Java object to its JSON representation. In order to do the serialization, we need to create the Gson object, which handles the conversion. Next, we need to call the function toJson() and pass the User object. Program output.


1 Answers

You need to give Gson information on the specific generic type of List you're using (or any generic type you use with it). Particularly when deserializing JSON, it needs that information to be able to determine what type of object it should deserialize each array element to.

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

This is documented in the Gson user guide.

like image 153
ColinD Avatar answered Oct 14 '22 18:10

ColinD