zoukankan      html  css  js  c++  java
  • IOS 序列化与反序列化NSKeyedUnarchiver

    开篇

    1到底这个序列化有何作用?

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

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

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

     大家有没有发现,其实plist 的数据是类型是有限制的,就那么几种特定的数据类型nsstring  ,大家有没有尝试过将一个自己定义的类放进去(写进plist ),再读出来?

    结果是什么大家可以先猜想。

    其实在nsstring 的类的定义中已经添加了协议<nscoding> 即实现了nscoding 代理的方法。

    @interface  NSString : NSObject <NSCopying, NSMutableCopying, NSCoding>

    深入

    3 NScoder  和 NScoding 

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

    -(id)initWithCoder:(NSCoder *)coder;//从coder中读取数据,保存到相应的变量中,即反序列化数据

    -(void)encodeWithCoder:(NSCoder *)coder;// 读取实例变量,并把这些数据写到coder中去。序列化数据

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

    NSKeyedUnarchiver   从二进制流读取对象。

    NSKeyedArchiver       把对象写到二进制流中去。

    4一个简单的例子

    一般是在自己定义的类中需要在.h 文件中加入<NScoding>

    在.m 文件众实现他的的两个代理方法,这个代理方法将会被自动调用

    - (void)encodeWithCoder:(NSCoder *)aCoder 
    {
        [aCoder encodeObject:self.InsureSolutionID forKey:@"personName"];
        [aCoder encodeObject:self.InsureSolutionName forKey:@"personAge"];
    }
    
    - (id)initWithCoder:(NSCoder *)aDecoder 
    {
        self = [super init];
        if (self) 
        {
            self.InsureSolutionID = [aDecoder decodeObjectForKey:@"personName"];
            self.InsureSolutionName = [aDecoder decodeObjectForKey:@"personAge"];
        }
        return self;
    }

    以上是对该类序列化和反序列化。

     NSData *archiveCarPriceData = [NSKeyedArchiver archivedDataWithRootObject:self.DataArray];
        [[NSUserDefaults standardUserDefaults] setObject:archiveCarPriceData forKey:@"DataArray"];
     
    
     NSData *myEncodedObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"DataArray"];
         self.dataList = [NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject];
  • 相关阅读:
    Java初学者的学习路线推荐
    C#基础(七)虚函数
    C#基础(六)--枚举的一些常用操作
    C#基础(五)--枚举的含义及其应用
    C#基础(四)--值类型和引用类型,栈和堆的含义
    C#基础(三)--运算符及条件控制语句
    Zipkin+Sleuth调用链监控集成和使用
    jenkins集成cucumber-resport报告
    微信小程序自动化,记录趟过的坑!
    解压版mysql+免破解版Navicat,好用!
  • 原文地址:https://www.cnblogs.com/langji/p/5625625.html
Copyright © 2011-2022 走看看