iOS-NSCoder的用法

iOS对象序列化与反序列化( NScoder 和 NScoding )

面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 二进制流可以通过网络或写入文件中(来源于某教材的一段话)

本人的理解是当你于写数据需要本地存储时,即将你的数据写到硬盘上的时候,你就必须对他进行序列化,转换成二进制文件,从而便于在磁盘上的读写,同理在取出的时候必须将其在反序列化,这样才能将数据读出来,就好比加密和揭秘的过程。

为什么我将数据写到plist 中的时候,也是存储到本地的磁盘上,但是我就没有序列化啊?

大家有没有发现,其实plist 的数据是类型是有限制的,就那么几种特定的数据类型,nsstring ,大家有没有尝试过将一个自己定义的类放进去(写进plist ),在读出来?
结果是什么大家可以先猜想。
其实在nsstring 的类的定义中已经添加了协议 即他是实现了nscoding 代理的方法的。
@interface NSString : NSObject

深入

NScoder 和 NScoding
NScoding 是一个协议,主要有下面两个方法

//从coder中读取数据,保存到相应的变量中,即反序列化数据
-(id)initWithCoder:(NSCoder *)coder;
// 读取实例变量,并把这些数据写到coder中去。序列化数据
-(void)encodeWithCoder:(NSCoder *)coder;

NSCoder 是一个抽象类,抽象类不能被实例话,只能提供一些想让子类继承的方法。

//从二进制流读取对象。
NSKeyedUnarchiver
//把对象写到二进制流中去。   
NSKeyedArchiver       

一个简单的例子

#import <Foundation/Foundation.h>
@interface Person : NSObject
{
    NSString *name;
    char sex;
    int age;
}
@property(nonatomic,copy) NSString *name;
@property char sex;
@property int age;
@end

person.m实现文件

#import "Person.h"
 

@implementation Person
@synthesize name,age,gender;
-(void)encodeWithCoder:(NSCoder *)aCoder
{
    
    [aCoder encodeObject:name forKey:@"stuName"];
    NSNumber *age1 = [NSNumber numberWithInt:age];
    [aCoder encodeObject:age1 forKey:@"stuAge"];
    NSNumber *gender1 = [NSNumber numberWithChar:gender];
    [aCoder encodeObject:gender1 forKey:@"stuGender"];
}
-(id)initWithCoder:(NSCoder *)dCoder
{
    name = [dCoder decodeObjectForKey:@"stuName"];
    age = [[dCoder decodeObjectForKey:@"stuAge"]intValue];
    gender = [[dCoder decodeObjectForKey:@"stuGender"]charValue];
    return self;
}
@end

main.m测试文件

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p1 = [[Person alloc]init];
        p1.name = @"zhangsan";
        p1.age = 22;
        p1.gender = 'F';
        Person *p2 = [Person new];
        p2.name = @"lisi";
        p2.age = 23;
        p2.gender = 'M';
        
        NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:30];
        
        [dic setObject:p1 forKey:@"person1"];
        [dic setObject:p2 forKey:@"person2"];
        //把字典内容存入到文件中
        if ([NSKeyedArchiver archiveRootObject:dic toFile:@"/Users/mac/Desktop/a.plist"] ) {
            NSLog(@"chenggong");
        }
        
        NSMutableDictionary *dic2 = [NSMutableDictionary dictionaryWithCapacity:30];
        //从文件中读取内容放入到字典中
        dic2 = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/mac/Desktop/a.plist"];
        NSEnumerator *enumerator = [dic2 objectEnumerator];
        id obj;
        //遍历字典内容
        while (obj = [enumerator nextObject]) {
            NSLog(@"name = %@,age = %i,gender = %c",[obj name],[obj age],[obj gender]);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/u013728021/article/details/83867532