개발/오류조치 및 팁
간단한 객체 직렬화 Serialization 방법 (인터페이스 구현 X)
안녕진
2022. 2. 18. 14:14
개인 공부 목적으로 올바르지 않은 정보가 있을 수 있습니다. 댓글로 지적해주시면 감사드리겠습니다.
직렬화?
앱이나 프로그램을 개발할 때, 객체(Object)들을 그대로 파일로 옮기려면 "직렬화"를 해야한다.
User라는 클래스를 예시로 들어보면
User {
String name;
int age;
String id;
String pw;
User({required this.name, required this.age, required this.id, required this.pw});
}
User person1 = User(name: "안형진", age: 23, id: "myId", pw: "myPw");
이 상황에서 person1을 파일에 저장하려면 외부 파일에 저장될 수 있도록 User라는 객체의 형태가 아닌, byte형태로 데이터를 전송해야 한다.
byte형태의 변환을 직렬화라고 하는데, byte형태로 직렬화 한 데이터를 다시 읽어서 객체의 형태로 변환하는 것을 역직렬화라고 한다.
1학년 때 배웠던 Java에서는 Serialiable interface를 구현해서 직렬화를 했는데,
dart에서 Serializable같은 게 있는지 찾아봤더니, 무슨 라이브러리를 설치하라고 해서 그냥 간단하게 구현해봤다.
비슷한 방식으로 다른 언어에서도 구현할 수 있을 것이다.
Json형태의 String으로 반환하도록 했다.
직렬화 메소드
String toJson() {
return jsonEncode({ // Map(파이썬의 dict)자료형을 String 자료형으로 변환해주는 메소드
'name': this.name,
'age': this.age,
'id': this.id,
'pw': this.pw,
});
}
역직렬화 메소드
// 어느 한 유저객체의 메소드가 아니고,
// User라는 클래스에서 사용하여 User를 반환할 메소드이므로 static 키워드를 사용했다.
static User fromJson(String jsonData) {
Map userData = jsonDecode(jsonData); // json String을 Map자료형으로 변환
return User(
'name': userData['name'],
'age': userData['age'],
'id': userData['id'],
'pw': userData['pw'],
);
}
한계
예시에서는 String, int 정도만 쓰여서, 간단했다.
하지만 User가 만약 Account라는 또 다른 클래스의 객체를 필드로 가져야 한다면,
혹은 List 형태의 어떤 필드를 가진다면,
그 필드에 대한 직렬화도 또 진행해줘야 하기 때문에 이 방식은 정말 간단한 프로젝트에서만 사용하는 게 좋은 것 같다.