复杂对象写入文件

//简单对象可以通过直接写入文件的方式进行存储,复杂对象我们无法直接写入文件,这个时候需要借助归档和反归档

//归档和反归档并不是数据持久化的方式,而是将复杂对象转化成简单对象的一种方式

Person * per = [Person new];
    per.name = @"欧阳冰";
    per.gender = @"神秘";
    per.hobby = @"美女";
    per.age = @"21";
    
    //准备一个路径
    NSString * path = NSHomeDirectory();
    path = [path stringByAppendingString:@"/曹江涛.avi"];
    NSLog(@"%@",path);
    //创建数据对象,用来存放person
    NSMutableData * data = [NSMutableData data];
    //创建归档对象
    NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    //归档
    [archiver encodeObject:per forKey:@"secret"];
    //完成归档
    [archiver finishEncoding];
    //写入文件(writeToFile)
    [data writeToFile:path atomically:YES];
    
    //反归档
    NSData * _data = [NSData dataWithContentsOfFile:path];
    //创建反归档对象
    NSKeyedUnarchiver * unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:_data];
    //反归档数据
    Person * per1 = [unarchiver decodeObjectForKey:@"secret"];
    //反归档完成
    [unarchiver finishDecoding];
    NSLog(@"%@",per1.name);

方法二:不用OC封装好的方法,序列化写入

将复杂对象序列化:

eg.将UserListsetNode *node,类型的对象写入文件。

#import <Foundation/Foundation.h>

@interface UserListsetNode : NSObject <NSCoding>//序列化
{
@public
    NSString* m_pstrInfo;//如果服务器异常这边就是错误信息
    NSArray *m_pUsersArray;
    NSMutableDictionary *m_pUserSetDic;
    NSString *m_pstrTime;
}

+(NSData*)Request:(NSString*)pstrToken ToId:(NSString*)pstrToId;
-(BOOL) DecodeJson:(NSData*)pData;

@end
#import "UserListsetNode.h"

@implementation UserListsetNode
+(NSData*)Request:(NSString *)pstrToken ToId:(NSString*)pstrToId{
    NSString *pstrUrl = [NSString stringWithFormat:@"%@%@",BASEURL,@"user/listset/"];
    NSString *pstrData = [NSString stringWithFormat:@"{\"token\":\"%@\",\"toid\":\"%@\"}",pstrToken,pstrToId];
    return [HttpUtil Request:pstrUrl data:pstrData];
}

-(BOOL)DecodeJson:(NSData *)pData{
    m_pstrInfo = @"";

    if (nil == pData)
    {
        return NO;
    }

    NSError *pError;
    NSDictionary *pRetDic = [NSJSONSerialization JSONObjectWithData:pData  options:NSJSONReadingMutableContainers error:&pError];

    if (nil == pRetDic)
    {
        return NO;
    }

    if ([[pRetDic objectForKey:@"status"] integerValue] == 0)
    {
        m_pstrInfo = [pRetDic objectForKey:@"info"];
        return NO;
    }else{
        NSArray *pArray = [[NSArray alloc]init];
        if(nil == m_pUserSetDic)
        {
            m_pUserSetDic = [[NSMutableDictionary alloc]init];
        }
        pArray = [pRetDic objectForKey:@"users"];
        for (NSDictionary *pDic in pArray) {
            for (int i =0; i<pDic.allKeys.count; i++) {
                NSString* pKey = [[pDic allKeys] objectAtIndex:i] ;
                [m_pUserSetDic setValue:[pDic objectForKey:pKey] forKey:pKey];
            }
        }
        m_pstrTime = [pRetDic objectForKey:@"time"];

    }

    return YES;

}
//序列化代码
-(void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:m_pstrInfo forKey:@"info"];
    [aCoder encodeObject:m_pUsersArray forKey:@"users"];
    [aCoder encodeObject:m_pUserSetDic forKey:@"set"];
    [aCoder encodeObject:m_pstrTime forKey:@"time"];
}

-(id)initWithCoder:(NSCoder *)aDecoder{
    m_pstrInfo = [aDecoder decodeObjectForKey:@"info"];
    m_pUsersArray =[aDecoder decodeObjectForKey:@"users"];
    m_pstrTime = [aDecoder decodeObjectForKey:@"time"];
    m_pUserSetDic = [aDecoder decodeObjectForKey:@"set"];
    return self;
}

@end

使用时:

-(void)SetUserSettings:(UserListsetNode *)pUserSet{
    if ([CommonUtil FileExist:DIR_USERLISTSET]) {
    //将序列化的对象写入文件
        [NSKeyedArchiver archiveRootObject:pUserSet toFile:DIR_USERLISTSET];
        [self GetUserSettings];

    }else{
        [[NSFileManager defaultManager]createFileAtPath:DIR_USERLISTSET contents:nil attributes:nil];
        [self SetUserSettings:pUserSet];
    }
}
时间: 2024-10-05 23:55:55

复杂对象写入文件的相关文章

对象写入文件和从文件中重构到对象

//将对象写入文件中 Game game = new Game(); game.Level = 2; game.Player = "Tom"; FileStream fs = new FileStream(@"game.bak",FileMode.OpenOrCreate,FileAccess.Write); StreamWriter sw = new StreamWriter(fs); sw.WriteLine(game.Player); sw.WriteLine

java中将list、map对象写入文件

链接地址:http://blog.sina.com.cn/s/blog_4a4f9fb50101p6jv.html 推荐:凤爪女瓜子男怪象该谁反思伦敦房价为什么持续暴涨 × wvqusrtg个人中心发博文消息 doudouhe的博客 http://blog.sina.com.cn/dechuan608hewei [订阅][手机订阅] 首页博文目录图片关于我 个人资料 doudouhe 微博 加好友发纸条 写留言加关注 博客等级: 博客积分:842 博客访问:222,144 关注人气:34 获赠金

Java将对象写入文件读出——序列化与反序列化

Java类中对象的序列化工作是通过ObjectOutputStream和ObjectInputStream来完成的. 写入: 1 File aFile=new File("e:\\c.txt"); 2 Stu a=new Stu(1, "aa", "1"); 3 FileOutputStream fileOutputStream=null; 4 try { 5 fileOutputStream = new FileOutputStream(aFi

通过codehaus来实现json写入文件和读取文件成json对象

原文:通过codehaus来实现json写入文件和读取文件成json对象 代码下载地址:http://www.zuidaima.com/share/1550463256562688.htm pom.xml需要增加如下依赖: <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-lgpl</artifactId> <version>1.

使用FileStream对象读写文件

在项目开发中经常会涉及到对文件的读写,c# 提供了很多种方式来对文件进行读写操作,今天来说说FileStream 对象. FileStream表示在磁盘或网络路径上指向文件的流.一般操作文件都习惯使用StreamReader 和 StreamWriter,因为它们操作的是字符数据 .而FileStream 对象操作的是字节和字节数组.有些操作是必须使用FileStream 对象执行的,如随机访问文件中间某点的数据. 创建FileStream 对象有许多不同的方法,这里使用文件名和FileMode

C#文本写入文件,追加写入文件

写入文件和这个对象 StreamWriter 1 using (StreamWriter fs = new StreamWriter(path, true)) 2 { 3 fs.WriteLine(strLog); 4 } 这个看到那个蓝色的true了没,个就是追加的标记,如果不写的话,那么你所有写一次,之前的都会被覆盖掉.

file_put_contents() ——将一个字符串写入文件

语法: int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] ) 参数 描述 filename 必需. 要被写入数据的文件名. 规定要写入数据的文件.如果文件不存在,则创建一个新文件. data 必需.规定要写入文件的数据.可以是字符串.数组或数据流. string,array 或者是 stream 资源 参数 data 可以是数组(但不能为多维数组),这就

小白学开发(iOS)OC_ 字符串写入文件(2015-08-13)

// //  main.m //  字符串写入文件 // //  Created by admin on 15/8/13. //  Copyright (c) 2015年 admin. All rights reserved. // #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { /* 将字符串写入到一个文件,并保存 > 需要写入文件的字符串内容

C++文件操作:打开文件和写入文件 zz

http://www.weixueyuan.net/view/5825.html 如果程序的运行结果仅仅显示在屏幕上,当要再次查看结果时,必须将程序重新运行一遍:而且,这个结果也不能被保留. 如果希望程序的运行结果能够永久保留下来,供随时查阅或取用,则需要将其保存在文件中. 文件分类 外部文件和内部文件 外部文件:指磁盘文件,也是通常所谓的文件. 内部文件:指在程序中运行的文件,更正式的称谓是“文件流对象”. 程序中操作的是内部文件,最后保存的是外部文件. 文本文件和二进制文件 文本文件:由字符