반응형
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
반응형
'programing' 카테고리의 다른 글
Type Script:부울을 문자열 값으로 변환 (0) | 2023.03.20 |
---|---|
스프링 부트 충돌 Bean 정의예외:@Controller 클래스의 주석 지정 빈 이름 (0) | 2023.03.20 |
컨트롤러에서 $inject를 사용할 수 없습니다. (0) | 2023.03.20 |
Jasmine 2.0 async done() 및 angular-mocks inject()가 같은 테스트 it()에서 사용됩니다. (0) | 2023.03.20 |
ng하위 수에 따른 숨김 또는 ngShow (0) | 2023.03.20 |