zoukankan      html  css  js  c++  java
  • 类的序列化和反序列化、对象的归档个解档

          对象的编码把对象的类特征以及对象状态转化为某种格式(二进制),这种格式可以存储,也可以在进程间和网络间传递

          类的类型以及实例数据会被写入到某种字节流中,当程序结束的时候,该字节流可以进行持久化。程序启动的时候,新分配的对象可以解码之前保存的自身描述,然后把自己恢复到之前运行时的状态。编码通常需要和归档协作。归档将对象转化成一种可以写进文件系统的格式(档案)。解档则是在档案上执行操作。在此过程中,保存在档案的对象需要对自身进行解码。

          所以,如果需要将某种类型的实例对象进行归结档,则首先需要对该类进行序列化和方序列化(编解码),该类需遵循NSCoding协议。

    1.序列化和反序列化

          协议中有两个Required方法:

    1 - (void)encodeWithCoder:(NSCoder *)aCoder;//序列化数据,保存到acoder中
    2 - (id)initWithCoder:(NSCoder *)aDecoder;//从aDecoder读取数据,保存到对应的变量中,反序列化数据
    而NSCoder则时一个抽象类,需要在其子类中实现。它的定义如下
    @interface NSCoder : NSObject
    - (void)encodeValueOfObjCType:(const char *)type at:(const void *)addr;
    - (void)encodeDataObject:(NSData *)data;
    - (void)decodeValueOfObjCType:(const char *)type at:(void *)data;
    - (NSData *)decodeDataObject;
    - (NSInteger)versionForClassName:(NSString *)className;
    @end
    2.归结档:有两种方式可以进行归结档操作。
    键--值方式:NSKeyedArchiver和NSKeyedUnarchiver,实例变量可按任意的次序编解码。
    顺序方式:NSArchiver和NSUnarchiver,以某种次序编码实例变量。解码的时候,仍要使用相同的次序。

    3.code示例

    定义类

    #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 magicNumber:(int) mn
    shoseSize:(float) ss; @end
    #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"]; } -(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[]) 
    { NSAutoreleasePool
    * pool = [[NSAutoreleasePool alloc] init]; codeObj *thing; thing=[[[codeObj alloc] initwithName:@"name" magicNumber:20 shoseSize:30.5] autorelease]; NSLog(@"--------%@",thing);
    //将自建类转换为NSData类型 NSData
    *freezeDrid; freezeDrid=[NSKeyedArchiver archivedDataWithRootObject:thing];
    //将NSData写入文件 [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 NSData *fileData; fileData=[NSData dataWithContentsOfFile:@"/tmp/objandobj.txt"];
    //将NSData转换为自建类 codeObj
    *fromFile; fromFile=[NSKeyedUnarchiver unarchiveObjectWithData:fileData]; NSLog(@"------%@",fromFile); [pool drain]; return 0; }

    或者可以

    #import "codeObj.h"
    int main (int argc, const char * argv[]) 
    {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    codeObj *inThing;
    codeObj *outThing; inThing
    =[[[codeObj alloc] initwithName:@"name" magicNumber:20 shoseSize:30.5] autorelease]; NSLog(@"--------%@",thing);
    //存入文件(归档)
    NSString *path;//假设path已经有值
    path = [[NSString alloc] initWithFormat:@"%@%@",path,@"/code.txt"];

    [NSKeyedArchiver archiveRootObject:inThing toFile:path]; //从文件中读取(解档) outThing=[NSKeyedUnarchiver unarchiveObjectWithFile:path]; }
     
     
     
  • 相关阅读:
    二分图 洛谷P2055 [ZJOI2009]假期的宿舍
    并查集 洛谷P1640 [SCOI2010]连续攻击游戏
    贪心 洛谷P2870 Best Cow Line, Gold
    贪心 NOIP2013 积木大赛
    快速幂 NOIP2013 转圈游戏
    倍增LCA NOIP2013 货车运输
    树形DP 洛谷P2014 选课
    KMP UVA1328 Period
    动态规划入门 BZOJ 1270 雷涛的小猫
    KMP POJ 2752Seek the Name, Seek the Fame
  • 原文地址:https://www.cnblogs.com/liuziyu/p/4246059.html
Copyright © 2011-2022 走看看