zoukankan      html  css  js  c++  java
  • objc对象归档 序列化

    NSString、NSArray、NSData、NSDictionary都实现了NSCoding协议,可直接通过调用writeToFile归档,那么OBJC自定义对象类型呢?首先实现NSCoding协议,重写encodeWithCode方法和initWithCode方法,然后通过NSKeyedArchiver转换为NSData,然后通过NSData的writeToFile方法写入到文件,或者将转换后的NSData放入到NSArray或NSDictionary中调用writeToFile写入到文件便可实现包装了自定义类型的数据和字典的归档;通过NSKeyedUnarchiver读取归档文件到对象,或者通过NSArray的arrrayWithContentsOfFile或NSDictionary的dictionaryWithContentsOfFile到数组对象或字典,然后取出序列化过的自定义对象(即自定义对象的NSData形式),然后通过NSKeyedUnarchiver反归档到对象。

     

    ------------------------------------------------测试代码------------------------------------------------ 
     
    NSString *str = @"hello"; 
        [str writeToFile:@"/Users/lili/Desktop/str.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil]; 
         
        NSArray *arr = [[NSArray alloc]initWithObjects:@"lili",@"tata", nil]; 
        [arr writeToFile:@"/Users/lili/Desktop/arr.txt" atomically:YES]; 
         
        NSDictionary *dict = [NSDictionary dictionaryWithObjects:@[@"lili",@"男"] forKeys:@[@"name",@"sex"]]; 
        [dict writeToFile:@"/Users/lili/Desktop/dict.txt" atomically:YES]; 
         
         
        Person *parent = [[Person alloc]init]; 
        parent.age = 40; 
        parent.name = @"lili"; 
         
        Person *child = [[Person alloc]init]; 
        child.age = 22; 
        child.name = @"linian"; 
         
        parent.child = child; 
         
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:parent]; 
        [data writeToFile:@"/Users/lili/Desktop/data.txt" atomically:YES]; 
         
        Person *people = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/lili/Desktop/data.txt"]; 
        NSLog(@"%@",people); 
         
        NSDictionary *dictPerson = [NSDictionary dictionaryWithObjects:@[[NSKeyedArchiver archivedDataWithRootObject:parent],[NSKeyedArchiver archivedDataWithRootObject:child]] forKeys:@[@"parent",@"child"]]; 
        [dictPerson writeToFile:@"/Users/lili/Desktop/dictPerson.txt" atomically:YES]; 
         
        NSDictionary *pdict = [NSDictionary dictionaryWithContentsOfFile:@"/Users/lili/Desktop/dictPerson.txt"]; 
        Person *tPerson = [NSKeyedUnarchiver unarchiveObjectWithData:[pdict objectForKey:@"parent"]]; 
        NSLog(@"%@",tPerson); 
         
         
         
        NSArray *arrPerson = [[NSArray alloc]initWithObjects:[NSKeyedArchiver archivedDataWithRootObject:parent],[NSKeyedArchiver archivedDataWithRootObject:parent], nil]; 
        [arrPerson writeToFile:@"/Users/lili/Desktop/arrPerson.txt" atomically:YES]; 
         
        NSArray *pArr = [NSArray arrayWithContentsOfFile:@"/Users/lili/Desktop/arrPerson.txt"]; 
        Person *aPerson = [NSKeyedUnarchiver unarchiveObjectWithData:[pArr objectAtIndex:0]]; 
        NSLog(@"%@",aPerson); 
     
     
    ------------------------------------------------Person类------------------------------------------------ 
     
    #import <Foundation/Foundation.h> 
    @interface Person : NSObject<NSCoding> 
    @property(strong,nonatomic)Person *child; 
    @property(assign,nonatomic)int age; 
    @property(copy,nonatomic)NSString *name; 
    @end 
     
     
    #import "Person.h" 
    @implementation Person 
    -(NSString *)description 
    { 
        return [NSString stringWithFormat:@"{age:%d,name:%@,child:%@}",self.age,self.name,self.child]; 
    } 
     
    -(void)encodeWithCoder:(NSCoder *)aCoder 
    { 
        [aCoder encodeInt:self.age forKey:@"age"]; 
        [aCoder encodeObject:self.name forKey:@"name"]; 
        [aCoder encodeObject:self.child forKey:@"child"]; 
    } 
     
    -(id)initWithCoder:(NSCoder *)aDecoder 
    { 
        if(self = [super init]){ 
            self.age = [aDecoder decodeIntForKey:@"age"]; 
            self.name = [aDecoder decodeObjectForKey:@"name"]; 
            self.child = [aDecoder decodeObjectForKey:@"child"]; 
        } 
        return self; 
    } 
    @end 


  • 相关阅读:
    改进SENet-ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks
    组集成网络-Group Ensemble: Learning an Ensemble of ConvNets in a single ConvNet
    轻量级网络-ReXNet:Diminishing Representational Bottleneck on Convolutional Neural Network
    ULSAM:Ultra-Lightweight Subspace Attention Module for Compact Convolutional Neural Networks
    工作中常用的 Shell 命令及技巧
    程序员需要熟悉的英语单词
    程序员基本素养
    Java 基础 —— Lambda 表达式
    将博客搬至CSDN
    IDEA 插件推荐 —— 让你写出好代码的神器!
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3003832.html
Copyright © 2011-2022 走看看