NSCoder对象编码和解码

本文详细介绍了如何在Objective-C中实现自定义类的编码和解码功能,包括类属性的编码、类实例的序列化与反序列化过程,以及在实际应用中的示例代码。同时展示了另一种使用NSCoding协议的实现方式,并通过示例代码说明了如何将对象转化为NSData,进而实现数据持久化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

//  codeObj.h

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

#imp ort <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.
//

#imp ort "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 archivedDataWithRootObje ct: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 archivedDataWithRootObje ct: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的archivedDataWithRootObje ct。(类到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);
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值