[Flutter]
[Flutter] 객체 디스크에 저장 (Feat. SharedPreferences with json)
Hevton
2022. 11. 6. 00:01
반응형
기본적으로 SharedPreference만 가지고서는 객체를 저장할 수 없다.
SharedPreference는 원시 자료형만 지원하기 때문이다.
하지만 객체를 json형태로 변환하면 String에 속하게 되므로, SharedPreference에 적용할 수 있다.
예시 코드로 보여주자면
모델을 먼저 만들고
class User {
String Firebase_UID;
String FCM_TOKEN;
List<String> SubscriptionList = [];
User(this.Firebase_UID, this.FCM_TOKEN);
User.fromJson(Map<String, dynamic> json)
: Firebase_UID = json['Firebase_UID'],
FCM_TOKEN = json['FCM_TOKEN'],
SubscriptionList = json['SubscriptionList'].cast<String>();
Map<String, dynamic> toJson() => {
'Firebase_UID': Firebase_UID,
'FCM_TOKEN': FCM_TOKEN,
'SubscriptionList': SubscriptionList,
};
}
얻어올 땐
Future<void> getUser() async {
SharedPreferences shared_User = await SharedPreferences.getInstance();
String? u = shared_User.getString('user');
if(u == null) {
in_User = User('tmp', 'tmp'); // 임시값
} else {
var userMap = jsonDecode(u);
in_User = User.fromJson(userMap);
}
return;
}
// in_User는 User 객체이다
저장할 땐
void saveUser() async {
SharedPreferences shared_User = await SharedPreferences.getInstance();
var u = jsonEncode(in_User!.toJson());
shared_User.setString('user', u);
}
// in_User는 User 객체이다
이렇게 간단하게 구현할 수 있다.
jsonEncode와 jsonDecode의 인자로 무엇이 넘겨지는지 잘 확인해보면 좋다!
jsonEncoding의 과정을 간단히 짚고 넘어가자면
객체 -> Map<String, dynamic> -> jsonString
이런식이 된다.
jsonDecoding의 과정을 이번엔 코드와 함께 보자면
jsonString -> Map<String, dynamic> -> 객체
var jsonString = ‘{“name”: “John Smith”,”email”: “john@example.com”}’;
Map<String, dynamic> user = jsonDecode(jsonString);
User u = User.fromJson(user)
이렇게 된다.
이런 전체적인 과정을 직렬화라고 한다.
직렬화 : 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터를 변환하는 기술
참고
JSON
https://medium.com/@thecodingpapa/json-flutter-61815c214eb8
반응형