NSCoder对象编码和解码
来源:互联网 发布:网站sql注入检测工具 编辑:程序博客网 时间:2024/05/19 10:07
转自:
//
// 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
@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
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 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);
}
读后感:在自己的类中实现NScoding协议作用是使自己的类支持“由类转换到NSData”的功能(仅是添加支持)。而真正实现此功能的是NSKeyedUnarchiver的unarchiveObjectWithData和NSKeyedArchiver的archivedDataWithRootObject。(类到NSData的转化)
下面是另一种NScoder用法。
下面是另一种NScoder用法。
//
// UserEntity.m
// NSCodingDemo
//
// Created by on 11-5-20.
// Copyright 2011 , Inc. All rights reserved.
//
#import "UserEntity.h"
#import "AddressEntity.h"
#defineSAMPLEDATA_KEY_USERNAME (@"userName")
#defineSAMPLEDATA_KEY_GENDER (@"gender")
#defineSAMPLEDATA_KEY_AGE (@"age")
#definek_FRIENDS (@"frinds")
#definek_ADDRESS (@"address")
#definek_userEntity_addresses (@"addresses")
@implementationUserEntity
@synthesizeuserName = _userName;
@synthesizegender = _gender;
@synthesizeage = _age;
@synthesizefriends = _friends;
@synthesizeaddress = _address;
@synthesizeaddresses = _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"
#definek_Id (@"id")
#definek_AddresEntity_address (@"addrss")
@implementationAddressEntity
@synthesizeId, 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
{
}
@end
#define
#define
@implementation
@synthesize
{
}
{
}
{
}
{
}
@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);
}
{
}
{
}
- NSCoder对象编码和解码
- NSCoder对象编码和解码
- ExtJs4之Ext.util.JSON编码和解码JSON对象
- base64编码和解码
- uuencode编码和解码
- BASE64编码和解码
- base64编码和解码
- base64编码和解码
- BASE64 编码和解码
- URL编码和解码
- NIO编码和解码
- 编码和解码问题
- Base64编码和解码
- 曼切斯特差分编码和解码
- BASE64编码和解码
- JavaScript编码 和 解码
- 编码和解码
- url编码和解码
- Linux环境进程间通信(五): 共享内存(上)
- 多处理器编程的艺术(修订版)
- pda 数据库
- 在eclipse中发布webservice遇到的两个问题:1.servers资源没有打开 2.配置文件找不到
- C语言中的关于“位域”的说明
- NSCoder对象编码和解码
- $(wildcard pattern)
- Linux下小型WEB服务器boa的使用
- FSMAC: A File System Metadata Accelerator with Non-Volatile Memory
- some learning resource for C++ 11
- Linux环境进程间通信(五): 共享内存(下)
- C#中匿名函数的使用
- MyEclipse 8.5 开发环境配置,汉化,Aptana2.0插件,SVN 插件,Flex Builder 3/4 插件安装
- 使用NSURLCache让本地数据来代替远程UIWebView请求