NSCoder對象編碼和解碼


轉自: http://o0o0o0o.javaeye.com/blog/588889

//  codeObj.h

//  encodeObject
//
//  Created by 110 on 10-2-6.
//  Copyright 2010 __MyCompanyName__. All rights reserved.
//

#import <Cocoa/Cocoa.h>

@interface codeObj : NSObject <NSCoding>{
NSString *name;
int magicNumber;
float shoseSize;
NSMutableArray *subThingies;
}
@property (copy) NSString *name;
@property int magicNumber;
@property float shoseSize;
@property (retain) NSMutableArray *subThingies;

-(id) initwithName:(NSString *) n
  magicNumber:(int) mn shoseSize:(float) ss;

@end



//  codeObj.m
//  encodeObject
//
//  Created by 110 on 10-2-6.
//  Copyright 2010 __MyCompanyName__. All rights reserved.
//

#import "codeObj.h"


@implementation codeObj

@synthesize name;
@synthesize magicNumber;
@synthesize shoseSize;
@synthesize subThingies;

-(id) initwithName:(NSString *) n
  magicNumber:(int) mn shoseSize:(float) ss{
if(self=[super init]){
self.name=n;
self.magicNumber=mn;
self.shoseSize=ss;
self.subThingies=[NSMutableArray array];
}
return (self);
}

-(void) dealloc{
[name release];
[subThingies release];
[super dealloc];
}
//nscoding協議的方法
-(void) encodeWithCoder:(NSCoder *) coder{
[coder encodeObject:name forKey:@"name"];
[coder encodeInt:magicNumber forKey:@"magicNumber"];
[coder encodeFloat:shoseSize forKey:@"shoseSize"];
[coder encodeObject:subThingies forKey:@"subThingies"];
}

-(id) initWithCoder:(NSCoder *)  decoder{
if(self =[super init]){
self.name=[decoder decodeObjectForKey:@"name"];
self.magicNumber=[decoder decodeIntForKey:@"magicNumber"];
self.shoseSize=[decoder decodeFloatForKey:@"shoseSize"];
self.subThingies=[decoder decodeObjectForKey:@"subThingies"];
}
return (self);
}

-(NSString *) description{
NSString *descripton=[NSString stringWithFormat:@"%@:%d,%.1f,%@",name,magicNumber,
shoseSize,subThingies];
return (descripton);
}


@end

#import "codeObj.h"
int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
codeObj *thing;
thing=[[[codeObj alloc] initwithName:@"name" magicNumber:20 shoseSize:30.5] autorelease];
NSLog(@"--------%@",thing);
NSData *freezeDrid;
freezeDrid=[NSKeyedArchiver archivedDataWithRootObject:thing];
[freezeDrid writeToFile:@"/tmp/codeobj.txt" atomically:YES];
codeObj *anotherThing;
anotherThing=[[[codeObj alloc] initwithName:@"ssssss" magicNumber:20 shoseSize:4.5] autorelease];
[anotherThing.subThingies addObject:thing];
 
NSData *other;
other=[NSKeyedArchiver archivedDataWithRootObject:anotherThing];
//寫入文件
[other writeToFile:@"/tmp/objandobj.txt" atomically:YES];
//從文件中讀取
NSData *fileData;
fileData=[NSData dataWithContentsOfFile:@"/tmp/objandobj.txt"];
codeObj *fromFile;
fromFile=[NSKeyedUnarchiver unarchiveObjectWithData:fileData];
NSLog(@"------%@",fromFile);
    [pool drain];
    return 0;
}

讀後感:在自己的類中實現NScoding協議作用是使自己的類支持“由類轉換到NSData”的功能(僅是添加支持)。而真正實現此功能的是NSKeyedUnarchiver的unarchiveObjectWithData和NSKeyedArchiver的archivedDataWithRootObject。(類到NSData的轉化)


下面是另一種NScoder用法。

//
//  UserEntity.m
//  NSCodingDemo
//
//  Created by   on 11-5-20.
//  Copyright 2011  , Inc. All rights reserved.
//

#import 
"UserEntity.h"
#import 
"AddressEntity.h"

#define SAMPLEDATA_KEY_USERNAME (@"userName")  
#define SAMPLEDATA_KEY_GENDER (@"gender")  
#define SAMPLEDATA_KEY_AGE (@"age")
#define k_FRIENDS (@"frinds")
#define k_ADDRESS (@"address")
#define k_userEntity_addresses (@"addresses")

@implementation UserEntity
@synthesize userName 
= _userName;
@synthesize gender   
= _gender;
@synthesize age      
= _age;
@synthesize friends  
= _friends;
@synthesize address  
= _address;
@synthesize addresses 
= _addresses;

-(void)dealloc
{
    [self.userName release];
    [self.friends release];
    [self.address release];
    [self.addresses release];
    [super dealloc];
}

  
- (void)encodeWithCoder:(NSCoder*)coder  
  {  
      [coder encodeObject:self.userName forKey:SAMPLEDATA_KEY_USERNAME];
      [coder encodeInt:self.age forKey:SAMPLEDATA_KEY_AGE];
      [coder encodeBool:self.gender forKey:SAMPLEDATA_KEY_GENDER];
      [coder encodeObject:self.friends forKey:k_FRIENDS];
      [coder encodeObject:self.address forKey:k_ADDRESS];
      [coder encodeObject:self.addresses forKey:k_userEntity_addresses];
  }  

  
- (id)initWithCoder:(NSCoder*)decoder  
  {  
      
if (self = [super init])
      {
          
if (decoder == nil)
          {
              
return self;
          }
          self.userName 
= [decoder decodeObjectForKey:SAMPLEDATA_KEY_USERNAME];
          self.gender 
= [decoder decodeBoolForKey:SAMPLEDATA_KEY_GENDER];
          self.age 
= [decoder decodeIntForKey:SAMPLEDATA_KEY_AGE];
          self.friends 
= [decoder decodeObjectForKey:k_FRIENDS];
          self.address 
= [decoder decodeObjectForKey:k_ADDRESS];
          self.addresses 
= [decoder decodeObjectForKey: k_userEntity_addresses];
      }
      
return self;
  } 

@end

#import "AddressEntity.h"
#define k_Id (@"id")  
#define k_AddresEntity_address (@"addrss")  


@implementation AddressEntity
@synthesize Id, address;
-(void)dealloc
{
    [self.address release];
    [super dealloc];
}
- (NSString *)description
{

    
return [NSString stringWithFormat:@"id :%d address: %@" , self.Id, self.address];
}

- (void)encodeWithCoder:(NSCoder*)coder  
{  
    [coder encodeObject:self.address forKey:k_AddresEntity_address];
    [coder encodeInt:self.Id forKey:k_Id];

}  

- (id)initWithCoder:(NSCoder*)decoder  
{  
    
if (self = [super init])
    {
        
if (decoder == nil)
        {
            
return self;
        }
        self.address 
= [decoder decodeObjectForKey:k_AddresEntity_address];
        self.Id 
= [decoder decodeIntForKey:k_Id];

    }
    
return self;

@end


-(IBAction)write:(id)sender
{
    
//get document path
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString 
*documentsDirectory = [paths objectAtIndex:0];
    
    NSString 
*filePath = [documentsDirectory stringByAppendingPathComponent:k_FILE_NAME];
    
    NSMutableData 
*data = [[[NSMutableData alloc] init] autorelease];
    NSKeyedArchiver 
*archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];
    UserEntity 
*userEntity = [[[UserEntity alloc] init] autorelease];
    userEntity.age 
= 18;
    userEntity.gender 
= NO;
    userEntity.userName 
= @"add";
    
    NSArray 
*friends = [[NSArray alloc] initWithObjects:@"ac"@"2"@"3"@"4", nil];
    userEntity.friends 
= friends;
    
    AddressEntity 
*address = [[[AddressEntity alloc] init] autorelease];
    address.Id 
= 1;
    address.address 
= @"china";
    userEntity.address 
= address;
    
    AddressEntity 
*address2 = [[[AddressEntity alloc] init] autorelease];
    address2.Id 
= 2;
    address2.address 
= @"china2";
    
    AddressEntity 
*address3 = [[[AddressEntity alloc] init] autorelease];
    address3.Id 
= 3;
    address3.address 
= @"china3";
    
    NSArray 
*addresses = [[NSArray alloc] initWithObjects:address2, address3 , nil];
    
    userEntity.addresses 
= addresses;
    
    [archiver encodeObject:userEntity forKey:
@"KEY"];
    [archiver finishEncoding];
    BOOL success 
= [data writeToFile:filePath atomically:YES];
    
    
}

-(IBAction)read:(id)sender
{
    NSArray 
*paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString 
*documentsDirectory = [paths objectAtIndex:0];
    
    NSString 
*filePath = [documentsDirectory stringByAppendingPathComponent:k_FILE_NAME];
    
    NSData 
*data = [[NSData alloc] initWithContentsOfFile:filePath];
    
    NSKeyedUnarchiver 
*unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    UserEntity 
*userEntity = [unArchiver decodeObjectForKey:@"KEY"];
    NSLog(
@"name is %@ , friend %@ address :%@ , addresses is :%@", userEntity.userName , userEntity.friends , userEntity.address, userEntity.addresses);
    
}

發佈了11 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章