직렬화(Serialization): OOP언어에서 특정 클래스 오브젝트를 파일로 저장하거나 파일에서 읽어들일 때 특수하게 가공하는 것을 의미. Objective-c나 Swift에서는 이부분은 Encode, Decode 용어를 사용

 

Encode: 직렬화(Serialize) 한다

Decode: 직렬화된 데이터를 오브젝트로 풀어내는 것(deserialization)을 의미

직렬화에서도 KVC(Key-Value Coding) 개념 사용됨 - property와 key 연결

NSCoder

  • byte stream을 추상화한 것
  • 데이터를 Coder로 쓰거나 Coder에서 데이터를 읽어 올 수 있음.
    (Coder - NSData 클래스에서 생성한 객체)
  • NSKeyedUnarchiver, NSKeyedArchiver를 사용하여 데이터 기록
    (NSCoder는 추상 클래스)

NSCoding protocol

- (id)initWithCoder:(NSCoder *)coder;               // 직렬화된 데이터에서 Object를 만들어 낼 때 호출

- (void)encodeWithCoder:(NSCoder *)coder;    // 직렬화할 때 자동 호출

 

NSKeyArchiver

// Swift
let data = NSKeyedArchiver.archivedDataWithRootObject(object)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: "object-key")

// Objective-c
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:object];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"object-key"];

 

NSKeyedUnarchiver

// Swift
if let data: NSData = NSUserDefaults.standardUserDefaults().objectForKey("object-key") as? NSData {
    let object: SomePersonClass = NSKeyedUnarchiver.unarchiveObjectWithData(data) as SomePersonClass
}

// Objective-C
NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"object-key"];
SomePersonClass *object = [NSKeyedUnarchiver.unarchiveObjectWithData:data];

 

NSUserDefaults

  • 파일 시스템에 초기 기본 설정과의 차이점을 User default database에 저장함
  • 프리미티브 타입이 아닌 객체를 저장하고 싶으면 위의 NSCoding protocol을 적용하여 저장함.

+ (NSUserDefaults *)standardUserDefaults    // 공유된 기본설정 객체
- (void)registerDefaults:(NSDictionary *)dictionary    // 초기 기본설정 등록

// 설정을 바꾸는 메소드
- (void)setBool:(BOOL)value forKey:(NSString *)defaultName 
- (void)setFloat:(float)value forKey:(NSString *)defaultName 
- (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName 
- (void)setObject:(id)value forKey:(NSString *)defaultName

- (BOOL)boolForKey:(NSString *)defaultName
- (float)floatForKey:(NSString *)defaultName
- (NSInteger)intgerForKey:(NSString *)defaultName
 - (id)objectForKey:(NSString *)defaultName

- (void)removeObjectForKey:(NSString *)defaultName

 

 

 

 

Ref. http://seorenn.blogspot.com/2014/11/swiftobjective-c-serialization.html

+ Recent posts