아이폰 객체의 직렬화 방법
아이폰 프로그래밍으로 객체를 저장하거나(파일로 혹은DB로) 네트워크로 보내거나 할려면 다른 플랫폼과 마찬가지로 직렬화(Serialization) 과정을 거쳐야 합니다.
코코아 프레임웍에서는 직렬화를 위해 오브젝트를 엔코딩/디코딩 해주는 편리한 클래스를 제공하고 있는데 아이폰에서 사용가능한 놈은 NSCoder를 상속받 은 NSKeyedArchiver와 NSKeyedUnarchiver입니다(아이폰에서 NSArchiver는 사용불가니 주의)
그럼 간단한 사용 방법을 보도록 하죠
먼저 NSString 오브젝트를 NSData타입으로 직렬화 해보도록 하겠습니다
엔코딩
NSString *str = @"블라블라블라";
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:str];
디코딩
NSString *str2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];
이렇게 됩니다. 참간단하죠? 하지만 주의해야할 점이 있습니다. NSKeyedArchiver로 인코딩/디코딩 가능한 오브젝트는 반드시 NSCoding프로토콜 불러오고 object내부에 -initWithCoder, -encodeWithCoder 메소드를 구현해줘야합니다. NSCoder는 이게 없으면 오브젝트를 어떻게 인코딩/디코딩할지 못알아 먹겠죠..
일단 자주 쓰는 데이터 저장을 위한 대부분의 클래스들은 NSCoding을 지원하고 있으니 특별히 손대줄 필요가 없습니다.(NSString , NSDictionary, NSArray... 등등등)
그럼 다양한 데이터를 가진 직접 만든 Object를 가지고 해보도록 하겠습니다.
UserObject.h
@interface UserObject : NSObject <NSCoding> { //NSCoding 프로토콜을 채용
NSString *str;
int int1;
double double1;
UIImage *img;
}
@property 구현
이렇게 NSString 객체,UIImage객체 , 정수형,실수형 데이터를 가진 오브젝트 입니다. 그럼 본격적으로 -initWithCoder, -encodeWithCoder의 구현을 해보겠습니다. 메소드의 구현은 NSDictionary등에서 익숙현 키벨류 방식으로 만들어 주면 됩니다.
UserObject.m
//먼저 인코딩 메소드 입니다.
-(void) encodeWithCoder:(NSCoder*) coder{
[coder encodeObject:str forKey:@"string"];
[coder encodeDouble:double1 forKey:@"double"]; // object형 이외의 실수형이나 정수형 데이터는 각각에 맞는 엔코딩/디코딩 메소드를 가지고 있습니다.
[coder encodeInt:int1 forKey:@"int"];
//[coder encodeObject:img forKey:@""]; 안타깝게 UIImage 클래스 레퍼런스를 확인하면 NSCoding을 지원하지 않습니다. 그렇기 때문에 이와같이 하면 에러가 납니다. 그렇게 때문에 UIImagePNGRepresentation메소드를 이용해서 UIImage의 이미지를 NSData타입으로 바꾼다음에 집어넣으면 됩니다.
[coder encodeObject:UIImagePNGRepresentation(img) forKey:@"img"];
}
//그다음 디코딩 메소드 입니다. 짝을 맞춰 줍시다.
-(id) initWithCoder:(NSCoder *)decoder{
if(self = [super init]{
self.str = [decoder decodeObjectForKey:@"string"];
self.double1 = [decoder decodeDoubletForKey:@"double"];
self.int1 = [decoder decodeIntForKey:@"int1"];
self.img = [UIImage imageWithData:[decoder decodeObjectForKey:@"img"]];
}
return self;
}
이런식으로 아무리 복잡한 데이터 형태의 오브젝트 라도 엔코딩/디코딩 메소드만 구현해주면 쉽게 직렬화가 됩니다. 이상입니다~
출처 : 네이버카페 - 맥부기
* 많은 내용이 책 또는 검색 후 개인적인 생각을 포함하여 개인용도로 쉽게 찾아보기 위해 정리한 것입니다.
본의 아니게 정리도중 출처를 읽어버린 경우가 있어 출처를 밝히지 못한 곳도 있으니 양해바랍니다.
문제가 될 경우 댓글 달아주시면 삭제/보완처리를 하겠습니다.
감사합니다.
'개발 > App Developer' 카테고리의 다른 글
테이블 스페이스 용량 보기 (0) | 2010.09.13 |
---|---|
Core Data 란? (0) | 2010.09.06 |
HIG (0) | 2010.09.06 |
cocos2d-iphone (예제포함) (0) | 2010.09.06 |
Apple Human Interface Guidelines - Characteristics of Great Software(7/7) (0) | 2010.09.06 |