IOS 对象序列化

1.前言:

     一般都是简单的数据类型(int,nsstring等)存储到plist  但是对于复杂的对象存储到plist或者NSUserDefault的时候就需要将对象序列化 ==编码/解码(序列化成二进制data来储存)

2. 用例场景

    消息推送过来(消息对象) 用户这时候刚好把程序kill了 此时需要把这个对象保存起来(NSUserDefault)就需要把对象序列化后存储

//
//  Car.h
//  demo
//
//  Created by linpeng on 14-7-30.
//  Copyright (c) 2014年 linpeng. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "LKDBHelper.h"



@interface Country : NSObject
/**
 *  名字
 */
@property(nonatomic,strong)NSString *name;
@end


//===============================


@interface Car : NSObject<NSCoding,NSCopying,NSMutableCopying>
/**
 *  颜色
 */
@property(nonatomic,strong)NSString *color;
/**
 *  中国制造
 */
@property(nonatomic,strong)NSString *madeBy;
/**
 *  进口国
 */
@property(nonatomic,strong)Country *comeFrom;
@end

//
//  Car.m
//  demo
//
//  Created by linpeng on 14-7-30.
//  Copyright (c) 2014年 linpeng. All rights reserved.
//

#import "Car.h"

@implementation Country

//将对象解码(反序列化)
-(id)initWithCoder:(NSCoder *)aDecoder
{
    if (self=[super init]) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
    }
    return self;
}
//将对象编码(即:序列化)
-(void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"name"];
}


@end

@implementation Car

+(NSString *)getTableName
{
    return @"CarTable";
}
//将对象解码(反序列化)
-(id)initWithCoder:(NSCoder *)aDecoder
{
    if (self=[super init]) {
        self.color = [aDecoder decodeObjectForKey:@"color"];
        self.madeBy = [aDecoder decodeObjectForKey:@"madeBy"];
        self.comeFrom = [aDecoder decodeObjectForKey:@"comeFrom"];
    }
    return self;
}
//将对象编码(即:序列化)
-(void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.color forKey:@"color"];
    [aCoder encodeObject:self.madeBy forKey:@"madeBy"];
    [aCoder encodeObject:self.comeFrom forKey:@"comeFrom"];
}

@end

3.使用

NSKeyedArchiver  //编码 / 序列化

NSKeyedUnarchiver //解码 /反序列化

  

 Car *car = [[Car alloc] init];
    car.color = @"reddadas";
    car.madeBy = @"linpeng";
    
    Country *c = [[Country alloc] init];
    c.name = @"中国";
    
    car.comeFrom = c;
    
    //序列化
    NSData *archiveCarPriceData = [NSKeyedArchiver archivedDataWithRootObject:car];
    //存储
    [[NSUserDefaults standardUserDefaults] setObject:archiveCarPriceData forKey:@"car"];
    
    NSLog(@"%@",archiveCarPriceData);
    
    //读取
    NSData *myEncodedObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"car"];
    //反序列化
    Car *cars = [NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject];
     NSLog(@"====%@=====%@===%@=\n",cars.color,cars.madeBy,cars.comeFrom.name);
4.结果




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 C++ 11 代码,可以将对象序列化为二进制或 JSON 格式。 ``` #include <iostream> #include <fstream> #include <sstream> #include <string> #include <vector> #include <boost/archive/binary_iarchive.hpp> #include <boost/archive/binary_oarchive.hpp> #include <boost/archive/json_iarchive.hpp> #include <boost/archive/json_oarchive.hpp> #include <boost/serialization/vector.hpp> using namespace std; class MyData { public: string name; int value; vector<string> items; MyData() : name(""), value(0) {} MyData(const string& _name, int _value, const vector<string>& _items) : name(_name), value(_value), items(_items) {} template<class Archive> void serialize(Archive & ar, const unsigned int version) { ar & name; ar & value; ar & items; } }; int main() { // create an instance of MyData MyData data("my data", 42, {"item1", "item2", "item3"}); // serialize to binary ofstream ofs("mydata.bin", ios::binary); boost::archive::binary_oarchive bo(ofs); bo << data; // deserialize from binary MyData data2; ifstream ifs("mydata.bin", ios::binary); boost::archive::binary_iarchive bi(ifs); bi >> data2; cout << "name: " << data2.name << ", value: " << data2.value << endl; for (const auto& item : data2.items) { cout << "item: " << item << endl; } // serialize to JSON ostringstream oss; boost::archive::json_oarchive jo(oss); jo << data; string json_str = oss.str(); cout << "JSON: " << json_str << endl; // deserialize from JSON MyData data3; istringstream iss(json_str); boost::archive::json_iarchive ji(iss); ji >> data3; cout << "name: " << data3.name << ", value: " << data3.value << endl; for (const auto& item : data3.items) { cout << "item: " << item << endl; } return 0; } ``` 注意: 1、需要安装 Boost 库(具体安装方法请自行搜索)。 2、在此示例中,MyData 类定义了一个模板函数 serialize()。这是 Boost 序列化库所要求的,用来指示需要序列化的数据成员。 3、这个例子使用了 Boost 序列化库的二进制格式和 JSON 格式。其他格式也可用,具体用法可以参考 Boost 序列化库的文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值