-
개인 공부 목적으로 올바르지 않은 정보가 있을 수 있습니다. 댓글로 지적해주시면 감사드리겠습니다.
직렬화?
앱이나 프로그램을 개발할 때, 객체(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 형태의 어떤 필드를 가진다면,
그 필드에 대한 직렬화도 또 진행해줘야 하기 때문에 이 방식은 정말 간단한 프로젝트에서만 사용하는 게 좋은 것 같다.'개발 > 오류조치 및 팁' 카테고리의 다른 글
[C언어] main 함수는 도대체 return을 왜 하는 걸까? (0) 2022.03.31 Android Studio virtual device (AVD)가 먹통인 경우 (0) 2022.02.27 Enumerable class (List 등) 원하는 값 필터링 방법 (0) 2022.02.16 JSON.parse() 메소드에서 발생하는 Unexpected token 오류 (0) 2022.02.07 AndroidStudio 에뮬레이터에서 앱 실행시 [INSTALL_FAILED_INSUFFICIENT_STORAGE] 오류 (0) 2022.02.03 댓글