`

对象编码

阅读更多

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

#import <Cocoa/Cocoa.h>

/**
 cocoa具备一种机制来将对象自身转换为某种格式并保存中磁盘上。
 对象可以将它们的实例变量和其他数据编码为数据块,然后保存到磁盘中。以后将这些数据块都会到内存中,并且
 还能基于保存的数据创建新对象。这个过程称为编码和解码,或称为序列化和反序列化。
 */
/**
 要编码的对象,必须实现NSCoding协议。
 @protocol NSCoding
 -(void) encoderWithCoder:(NSCoder *) aCoder;
 -(id) initWithCoder:(NSCoder *) aDecoder;
 @end
 当对象需要保存自身时-encoderWithCoder:方法被调用
 当对象需要加载自身时-initWithCoder:方法被调用
 */
@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"];
}
/**
 initWithCode:和其他init方法一样,中对对象执行操作之前,需要使用超类对它们进行初始化。为此,可以采用
 两种方式,具体取决于父类,如果父类采用了NSCoding协议,则应该调用[super initWithCoder:decoder];
 否则,只需要调用[super init]即可。NSObject不采用NSCoding协议,因此我们可以使用简单的init方法
 */

/**
 decodeObjectForKey:把一个对象从解码器中取出
 decodeIntForKey:把int从解码器中取出,在嵌入的对象上递归使用initWithCoder:方法。
 */
-(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 <Foundation/Foundation.h>
#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);
	/**
	 +archivedDataWithRootObject:类方法编码thing对象。首先,它在后台创建一个NSKeyedArchiver实例
	 ,然后,它将NSKeyedArchiver实例传递给对象thing的-encodeWithCoder:方法。当thing编码自身的属性时
	 ,它可能对其他对象也进行编码,例如字符串,数组以及我们可能输入到该数组中的任何内容。整个对象集合完成键和值
	 的编码后,具有键/值对的归档程序将所有对象扁平化为一个NSData类并将其返回.
	 */
	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;
}
 
分享到:
评论
3 楼 xiaozhao-521 2010-06-10  
cx_jin 写道
有个疑问?
为何协议申明encoderWithCoder:的参数是aCoder 而实现时是coder呢?


要编码的对象,必须实现NSCoding协议。 
@protocol NSCoding 
-(void) encoderWithCoder:(NSCoder *) aCoder
-(id) initWithCoder:(NSCoder *) aDecoder
@end

为何实现implementation 时
-(void) encodeWithCoder:(NSCoder *) coder == aCoder
-(id) initWithCoder:(NSCoder *)  decoder  ==  aDecoder


这个只是形参,叫什么名字没有什么关系的
2 楼 cx_jin 2010-06-04  
有个疑问?
为何协议申明encoderWithCoder:的参数是aCoder 而实现时是coder呢?


要编码的对象,必须实现NSCoding协议。 
@protocol NSCoding 
-(void) encoderWithCoder:(NSCoder *) aCoder
-(id) initWithCoder:(NSCoder *) aDecoder
@end

为何实现implementation 时
-(void) encodeWithCoder:(NSCoder *) coder == aCoder
-(id) initWithCoder:(NSCoder *)  decoder  ==  aDecoder
1 楼 cx_jin 2010-06-04  
学习了,谢谢!

相关推荐

    北京南水北调水务工程对象编码应用

    ### 北京南水北调水务工程对象编码应用 #### 一、背景介绍与意义 北京南水北调工程作为优化中国水资源时空配置的重大措施,旨在解决北方地区严重的水资源短缺问题。随着信息化项目的推进,如何统一各系统的水务...

    北京南水北调水务工程对象编码应用.pdf

    《北京南水北调水务工程对象编码应用》这篇文档主要探讨了在北京市南水北调工程中,如何通过建立统一的水务工程对象编码系统来优化信息资源整合,提升工程管理效率和水资源配置。以下是对文档中关键知识点的详细阐述...

    音视频对象编码 ISO 14496-1

    音视频对象编码 ISO 14496-1,通常被称为MPEG-4 Part 1或ISO/IEC 14496-1,是国际标准化组织(ISO)和国际电工委员会(IEC)联合制定的一份技术标准,旨在为多媒体数据提供高效且灵活的编码方法。该标准是MPEG-4系列...

    易语言对象型编码转换源码

    同时,通过自定义类,开发者还可以构建自己的对象编码规则,以满足特定需求。 在描述中提到的“@易语言源码分享站”,可能是指一个社区或者网站,该站点提供易语言的源代码分享和学习资源。对于初学者来说,这样的...

    PRP系统关键对象编码解读PPT教案.pptx

    PRP系统关键对象编码解读PPT教案.pptx

    JSON 编码/解码:解析 JSON 字符串并返回 MATLAB 对象或将 MATLAB 对象编码为 JSON 字符串-matlab开发

    json_encode 将 MATLAB 对象编码为 JSON 字符串。 结构转换为 JSON 对象,数组转换为 JSON 数组。 Inf 值被转换为字符串“Inf”。 NaN 值转换为“空”。 笔记: 此函数实现了原始 RFC 4627 中指定的 JSON 超集 - ...

    深度访谈式研究范式--对象编码、正文论据支撑.caj

    深度访谈式研究范式--对象编码、正文论据支撑.caj

    基于对象的精细可伸缩性编码

    本文探讨了一种名为“基于对象的精细可伸缩性编码”(FGSIO)的技术,这是一种结合了对象编码与位平面编码的方法,旨在解决在丢包网络环境下高质量医学图像传输的问题。 **核心概念解释**: 1. **精细可伸缩性编码*...

    面罩辅助对象编码和深度学习,可用于监控视频中的对象检索

    在“面罩辅助对象编码和深度学习用于监控视频中的对象检索”这篇研究论文中,作者团队提出了一种基于深度学习的视觉对象编码和检索方法。该方法利用了深度神经网络的非线性映射能力,并结合面罩信息来辅助对象的表示...

    MPEG-4编码技术

    1. 视觉对象编码:MPEG-4中包含了多种编码算法,如Advanced Simple Profile (ASP) 和 Advanced Video Coding (AVC),也被称为H.264。ASP主要应用于移动设备和低带宽环境,而AVC则提供了更高的压缩效率,广泛用于高清...

    建筑工程设计信息模型分类和编码标准

    建筑工程设计信息模型分类和编码标准,为住建部组织编制的BIM实施标准的征求意见稿

    binary-encoding:Binary_Encoding将对象编码到缓冲区中。 Binary_Encoding.Record将表ID以及记录的键和值成分编码到缓冲区中

    `Binary_Encoding` 库或模块可能是为了解决这一需求而设计的,它允许开发者高效地将对象编码为二进制格式,并存储或传输这些数据。 `Binary_Encoding` 提供了将对象编码到缓冲区(Buffer)的功能,Buffer是Node.js...

    光电编码器讲义.ppt

    本讲义涵盖了光电编码器的基础知识,包括编码器的认识、测量对象、测量方式、绝对式测量、增量式测量、在数字测速和主轴控制中的应用等内容。 一、认识编码器 编码器是测量旋转或直线位移的传感器,常用于机器人...

    基于对象的多媒体数据压缩编码国际 [1].rar_MPEG_MPEG4 中文_数据压缩_钟玉琢

    2. **对象编码**:在MPEG4中,多媒体数据被表示为一个个独立的“视觉对象”,每个对象可以单独进行压缩。这种基于对象的方法允许对不同对象应用不同的编码策略,比如对运动物体采用更高效的运动补偿预测,对静止背景...

    MPEG-4b编码技术

    MPEG-4不仅仅关注视频编码,还包括音频、交互性和对象编码,旨在实现多媒体内容的高效存储、传输和管理。 MPEG-4编码的核心在于它的分层和对象导向性。与早期的MPEG-1和MPEG-2标准相比,MPEG-4更注重内容的独立性,...

    SimpleLuaTable:AS3类。 将AS3对象编码到Lua表中。 将Lua表字符串解码为AS3对象

    将AS3对象编码到Lua表中。 将Lua表字符串解码为AS3对象。 ### AS3对象的输入和输出示例: var as3Obj = new Object () ;as3Obj [ "name" ] = "foo" ; &lt;---&gt; Lua字符串: return { name = " foo " ,} 限制:不...

    各主要视频编码规范的比较

    2. MPEG4:相比MPEG2,MPEG4引入了更多先进的编码技术,如形状自适应块运动补偿、对象编码和高级预测模式。这使得MPEG4在处理复杂场景和对象分离上更为优秀,尤其适用于交互式多媒体应用。 3. H.264/AVC:H.264(也...

    MPEG-4编码库

    3. 数据分组:MPEG-4支持对象编码,允许独立编码和处理视频中的不同对象,如人物、背景等,增强了交互性和可扩展性。 4. 复用和封装:将编码后的音视频数据按照MPEG-4容器格式(如MP4或3GP)进行组织,便于存储和...

    mina框架自定义解编码器

    在MINA框架中,解编码器是数据传输过程中的关键组件,负责将接收到的原始字节流转化为应用程序可以理解的对象,或者将应用程序准备发送的对象编码成字节流。自定义解编码器能帮助我们更好地处理特定的协议格式,...

Global site tag (gtag.js) - Google Analytics