objective-c基于key的序列化和反序列化

本文介绍了一个自定义 Objective-C 类实现 NSCoding 协议进行序列化和反序列化的示例,展示了如何保存和恢复类实例的状态。

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

序列化和反序列化自己定义的类,注意以下代码不保证引用计数的正确性,还没有学到这些。

#import <Foundation/Foundation.h>

@interface ClassA: NSObject <NSCoding>
{
	NSString *name;
	int size;
	float money;
	NSArray *array;
}
@property (retain) NSString *name;
@property int size;
@property float money;
@property (copy) NSArray *array;

@end

@implementation ClassA
@synthesize name;
@synthesize size;
@synthesize money;
@synthesize array;

-(id) init
{
	if (self = [super init])
	{
		name = [NSString stringWithFormat: @"%@=100", @"hello"];
		size = 99;
		money = 88.7654321;
		array = [NSArray arrayWithObjects: @"world", [NSNumber numberWithInt: 10], [NSNull null], nil];
	}
	return self;
}

-(NSString *) description
{
	NSString *desc = [NSString stringWithFormat: @"name=%@ size=%i money=%f array=%@", name, size, money, array];
	return desc;
}

-(void) encodeWithCoder: (NSCoder *) aCoder
{
	[aCoder encodeObject: self.name forKey: @"name"];
	[aCoder encodeInt: self.size forKey: @"size"];
	[aCoder encodeFloat: self.money forKey: @"money"];
	[aCoder encodeObject: self.array forKey: @"array"];
}

-(id) initWithCoder: (NSCoder *) aDecoder
{
	if (self = [super init])
	{
		self.name = [aDecoder decodeObjectForKey: @"name"];
		self.size = [aDecoder decodeIntForKey: @"size"];
		self.money = [aDecoder decodeFloatForKey: @"money"];
		self.array = [aDecoder decodeObjectForKey: @"array"];
	}
	return self;
}
@end

int main(const int argc, const char *argv[])
{
	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];

    ClassA *ca = [ClassA new];
    NSLog(@"1 %@", ca);
    [NSKeyedArchiver archiveRootObject: ca toFile: @"ca.bin"];
    [ca release];
    ClassA *ca1 = [NSKeyedUnarchiver unarchiveObjectWithFile: @"ca.bin"];
    NSLog(@"2 %@", ca1);

	[pool drain];
	return 0;
}

windows下输出结果
C:\GNUstep\msys\1.0\home\pro\cpro>cpro.exe
2015-02-05 10:10:33.989 cpro[5852] 1 name=hello=100 size=99 money=88.765434 array=(world, 10, "<null>")
2015-02-05 10:10:34.033 cpro[5852] 2 name=hello=100 size=99 money=88.765434 array=(world, 10, "<null>")
序列化以后生成的二进制文件。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值