programing

Gson의 POJO 어레이 리스트 시리얼화 문제

subpage 2023. 3. 20. 23:14
반응형

Gson의 POJO 어레이 리스트 시리얼화 문제

저는 simpleXML을 시리얼라이제이션 요구에 사용할 예정이었지만 JSON을 사용해 새로운 것을 배울 생각입니다.

이것은 Gson 1.7.1을 사용하여 테스트 POJO의 ArrayList를 시리얼화하기 위해 사용하는 코드입니다.

주의: 코드를 단순화하기 위해 문자열 "s"의 리더/라이터를 제거했습니다.

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

내 초보자 눈에는 이게 맞는 것 같아.디시리얼라이즈된 오브젝트 목록에만 TestObject의 I시리얼라이즈된 오브젝트가 아닌 기본 오브젝트가 포함됩니다.제가 이 일을 하기 위해 무엇을 할 수 있는지 설명해 주실 수 있나요?

편집:

테스트로 수정: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:

솔직히 이유는 모르겠지만 TestObject에 내장된 단순한 String[]을 ArrayList로 바꾸자 올바르게 시리얼화되기 시작했습니다.

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

Gson에게 특정 범용 타입의 정보를 제공해야 합니다.List사용하고 있는 것(또는 사용하고 있는 범용 타입).특히 JSON을 역직렬화할 때 각 어레이 요소를 역직렬화할 오브젝트 유형을 결정하기 위해서는 이 정보가 필요합니다.

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

이것은 Gson 유저 가이드에 기재되어 있습니다.

언급URL : https://stackoverflow.com/questions/5813434/trouble-with-gson-serializing-an-arraylist-of-pojos

반응형