iOS 归档 反归档

移动开发 waitig 454℃ 百度已收录 0评论

创建一个 Person 类

//定义基本属性
@property(nonatomic,strong)NSString *name;
@property(nonatomic,strong)NSString *gender;
@property(nonatomic,assign)int age;

1,首先,复杂对象所属的类要遵循<NSCoding>协议

@interface Person : NSObject<NSCoding>

2,-(void)encodeWithCoder:(NSCoder *)aCoder;序列化/归档

/归档(序列化)
//对person对象进行归档时,此方法执行
//对person中想要进行归档的所有属性,进行序列化操作
-(void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self.gender forKey:@"gender"];
    [aCoder encodeInt:self.age forKey:@"age"];
}

3:-(instancetype)initWithCoder:(NSCoder *)aDecoder;反序列化

//反归档(反序列化)
//对person对象进行反归档时,该方法执行
//创建一个新的person对象,所有属性都是通过反序列化得到
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init]) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.gender = [aDecoder decodeObjectForKey:@"gender"];
        self.age = [aDecoder decodeIntForKey:@"age"];
    }

    return self;
}

复杂对象写入文件

#pragma mark  --复杂对象写入文件
-(void)archiver
{
    Person *per = [Person new];
    per.name = @"小美眉";
    per.gender = @"女";
    per.age = 18;


    //准备路径:
    NSString *path = NSHomeDirectory();
    NSLog(@"%@",path);

    path = [path stringByAppendingPathComponent:@"singeGirl.txt"];
    //1:准备存储数据的对象
    NSMutableData *data = [NSMutableData data];
    //2:创建归档对象
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    //3:开始归档
    [archiver encodeObject:per forKey:@"person"];
    //4:完成归档
    [archiver finishEncoding];
    //5:写入文件当中
    BOOL result = [data writeToFile:path atomically:YES];
    if (result) {
        NSLog(@"归档成功:%@",path);
    }else
    {
        NSLog(@"归档不成功!!!");
    }
#pragma mark ---  反归档/反序列化/解码/解档 ----
    //准备解档路径
    NSData *myData = [NSData dataWithContentsOfFile:path];
    //创建反归档对象
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:myData];
    //反归档
    Person *aper = [Person new];
    aper = [unarchiver decodeObjectForKey:@"person"];
    //完成反归档
    [unarchiver finishDecoding];
    //测试
    NSLog(@"%@",aper.name);
    NSLog(@"%@",aper.gender);
}

Foundation框架对象 归档

-(void)foundationClassArchiver
{
   //获取文件路径
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    //
    NSString *filePath = [documentPath stringByAppendingPathComponent:@"archiverFile"];
    //归档
    NSArray *archiverArray = @[@"小萝莉",@"小正太",@"UI",@"OC"];
    BOOL result = [NSKeyedArchiver archiveRootObject:archiverArray toFile:filePath];

    if (result) {
        NSLog(@"归档成功:%@",filePath);
    }else
    {
        NSLog(@"归档失败");
    }

    //反归档
    NSArray *unarchiverArr = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

    NSLog(@"%@",unarchiverArr);
}

对自定义的内容进行归档

//获取文件路径
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

    //在document文件夹下,创建新的文件
    NSString *filePath = [documentPath stringByAppendingPathComponent:@"customFile"];

    //1:使用Data对象进行归档
    NSMutableData *archiverData = [NSMutableData data];
    //2:创建归档对象
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:archiverData];
    //3:自己定义数据内容(数据内容以键值对的形式存在)
    [archiver encodeObject:@"尼古拉斯.赵四" forKey:@"ZS"];
    [archiver encodeObject:@[@"爱新觉罗",@"努尔哈赤",@"叶赫那拉"] forKey:@"name"];
    [archiver encodeInt:28 forKey:@"age"];
    //4:完成归档
    [archiver finishEncoding];
    //5:写入
    BOOL result = [archiverData writeToFile:filePath atomically:YES];

    if (result) {
        NSLog(@"归档成功:%@",filePath);
    }


    //反归档
    //1:读取文件,生成NSData类型
    NSData *unarchiverData = [NSData dataWithContentsOfFile:filePath];
    //2:创建反归档对象
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:unarchiverData];
    //3:反归档.根据可以访问
    NSString *ZS = [unarchiver decodeObjectForKey:@"ZS"];
    NSLog(@"%@,%@",ZS,filePath);

NSUserDefaults

-(void)writeNSUserDf
{

   /*
    NSUserDefaults是一个单例,在整个应用程序当中只有一个实例对象,他可以用于数据的永久保存,简单实用,这是它可以让数据自由传递的一个前提.
    NSUserDefaults:它可以存储一些类型的数据:NSNumber,NSString,NSData,NSArray......
    */

//    NSUserDefaults
    NSArray *arrays = @[@"橘子",@"香蕉",@"西瓜",@"草莓",@"大苹果"];
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    //存
    [user setObject:arrays forKey:@"userarrays"];

    //取
    NSArray *strings = [user objectForKey:@"userarrays"];
    NSLog(@"%@",strings);



warning 注意:对相同的key赋值约等于一次覆盖,要保证每一个key的唯一性
//    NSUserDefaults 存储的对象完全是不可变的(这一点十分关键,如果弄错会出现bug),例如,如果我想要存储一个NSMutableArray对象.我必须先创建一个不可变数组(NSArray),然后在去存入
    NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"456",@"789", nil];
    NSArray *array = [NSArray arrayWithArray:mutableArray];

    NSUserDefaults *user2 = [NSUserDefaults standardUserDefaults];

    [user2 setObject:array forKey:@"我们这里存放的一定是不可变的"];


    //自定义数据类型存储到NSUserDefaults
    Person *per = [Person new];
    per.name = @"小白";
    per.age = 14;
    per.gender = @"男";
    //创建存放person的数组
    NSMutableArray *dataArray = [NSMutableArray arrayWithCapacity:0];
    //将person类型转换成为NSData类型
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:per];
    //将data存入到数组当中
    [dataArray addObject:data];
    NSUserDefaults *user1 = [NSUserDefaults standardUserDefaults];
    [user1 setObject:data forKey:@"person"];
    NSLog(@"%@",user1);

    //取出数据
    NSUserDefaults *user3 = [NSUserDefaults standardUserDefaults];
    NSData *data3 = [user3 objectForKey:@"person"];
    Person *per3 = [NSKeyedUnarchiver unarchiveObjectWithData:data3];
    NSLog(@"%@",per3);



}

本文由【waitig】发表在等英博客
本文固定链接:iOS 归档 反归档
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)