转自:
//
//
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
@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
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[]) {
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);
}
读后感:在自己的类中实现NScoding协议作用是使自己的类支持“由类转换到NSData”的功能(仅是添加支持)。而真正实现此功能的是NSKeyedUnarchiver的unarchiveObjectWithData和NSKeyedArchiver的archivedDataWithRootObje
ct。(类到NSData的转化)
下面是另一种NScoder用法。
下面是另一种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
//
//
//
//
//
//
#import
#import
#define
#define
#define
#define
#define
#define
@implementation
@synthesize
@synthesize
@synthesize
@synthesize
@synthesize
@synthesize
- ( void )dealloc
{
}
@end
#import
#define
#define
@implementation
@synthesize
- ( void )dealloc
{
}
-
{
}
-
{
}
-
{
}
@end
-
(IBAction)write:(id)sender
{
//
get document path
NSArray
*
paths
=
NSSearchPathForDirectori esInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString
*
documentsDirectory
=
[paths objectAtIndex:
0
];
NSString
*
filePath
=
[documentsDirectory stringByAppendingPathCom ponent:k_FILE_NAME];
NSMutableData
*
data
=
[[[NSMutableData alloc] init] autorelease];
NSKeyedArchiver
*
archiver
=
[[[NSKeyedArchiver alloc] initForWritingWithMutabl eData: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
=
NSSearchPathForDirectori esInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString
*
documentsDirectory
=
[paths objectAtIndex:
0
];
NSString
*
filePath
=
[documentsDirectory stringByAppendingPathCom ponent: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);
}
{
}
- (IBAction)read:(id)sender
{
}