`

对象编码

阅读更多

//
//  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