본문 바로가기

개발/App Developer

아이폰 객체의 직렬화 방법 - 맥부기 펌

아이폰 객체의 직렬화 방법


아이폰 프로그래밍으로 객체를 저장하거나(파일로 혹은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