ios序列化最终方案

最近在整合一些与服务器交互的东西,准备使用序列化的一些东西

 

使用NSCoding 来进行NSObject 的序列化实现: 整合了网上搜集的两片文章完成了功能:

http://www.cnblogs.com/likwo/archive/2011/05/26/2058134.html 

- (void)encodeWithCoder:(NSCoder*)coder
{
    Class clazz 
= [self class];
    u_int count;
    
    objc_property_t
* properties = class_copyPropertyList(clazz, &count);
    NSMutableArray
* propertyArray = [NSMutableArray arrayWithCapacity:count];
    
for (int i = 0; i < count ; i++)
    {
        
const char* propertyName = property_getName(properties[i]);
        [propertyArray addObject:[NSString  stringWithCString:propertyName encoding:NSUTF8StringEncoding]];
    }
    free(properties);
    
    
    
for (NSString *name in propertyArray)
    {
        id value 
= [self valueForKey:name];
        [coder encodeObject:value forKey:name];
    }
}

- (id)initWithCoder:(NSCoder*)decoder
{
    
if (self = [super init])
    {
        
if (decoder == nil)
        {
            
return self;
        }
        
        Class clazz 
= [self class];
        u_int count;
        
        objc_property_t
* properties = class_copyPropertyList(clazz, &count);
        NSMutableArray
* propertyArray = [NSMutableArray arrayWithCapacity:count];
        
for (int i = 0; i < count ; i++)
        {
            
const char* propertyName = property_getName(properties[i]);
            [propertyArray addObject:[NSString  stringWithCString:propertyName encoding:NSUTF8StringEncoding]];
        }
        free(properties);
        
        
        
for (NSString *name in propertyArray)
        {
            id value 
= [decoder decodeObjectForKey:name];   
            [self setValue:value forKey:name];
        }
    }
    
return self;
}

 

http://www.cnblogs.com/Kiros/archive/2012/03/09/2387532.html

先是自定义一个自己的类  需要继承 NSCoding  接口

-------------------------------------//我是分隔线//-----------------------------------------

#import <Foundation/Foundation.h>


@interface FourLines : NSObject <NSCoding,NSCopying> {

}
@property (nonatomic,retain) NSString *field1;
@property (nonatomic,retain) NSString *field2;
@property (nonatomic,retain) NSString *field3;
@property (nonatomic,retain) NSString *field4;

@end

 

#import "FourLines.h"
#define kField1Key @"Field1"
#define kField2Key @"Field2"
#define kField3Key @"Field3"
#define kField4Key @"Field4"

@implementation FourLines

@synthesize field1;
@synthesize field2;
@synthesize field3;
@synthesize field4;

- (void) encodeWithCoder:(NSCoder *)aCoder{
 [aCoder encodeObject:field1 forKey:kField1Key];
 [aCoder encodeObject:field2 forKey:kField2Key];
 [aCoder encodeObject:field3 forKey:kField3Key];
 [aCoder encodeObject:field4 forKey:kField4Key];
}

- (id)initWithCoder:(NSCoder *)aDecoder{
 if (self = [super init]) {
  field1 = [[aDecoder decodeObjectForKey:kField1Key] retain];
  field2 = [[aDecoder decodeObjectForKey:kField2Key] retain];
  field3 = [[aDecoder decodeObjectForKey:kField3Key] retain];
  field4 = [[aDecoder decodeObjectForKey:kField4Key] retain];
 }
 return self;
}

- (id)copyWithZone:(NSZone *)zone{
 FourLines *copy = [[[self class] allocWithZone:zone] init];
 copy.field1 = [[self.field1 copyWithZone:zone] autorelease];
 copy.field2 = [[self.field2 copyWithZone:zone] autorelease];
 copy.field3 = [[self.field3 copyWithZone:zone] autorelease];
 copy.field4 = [[self.field4 copyWithZone:zone] autorelease];
 return copy;
}

- (void)dealloc{
 [field1 release];
 [field2 release];
 [field3 release];
 [field4 release];
 [super dealloc];
}

@end

 

下面是一个controller 来实现如何持久化自定义类

 

#import <UIKit/UIKit.h>

 //#define kFilename @"data.plist"
#define kFilename @"archive"
#define kDataKey @"Data"
 //define kFilename @"dataarchiive.plist"
 //#define kDataKey @"Data"
 //#define kFilename @"data.sqlite3"

@interface PersistenceViewController : UIViewController {

}
@property (nonatomic,retain) IBOutlet UITextField *field1;
@property (nonatomic,retain) IBOutlet UITextField *field2;
@property (nonatomic,retain) IBOutlet UITextField *field3;
@property (nonatomic,retain) IBOutlet UITextField *field4;

- (NSString *)dataFilePath;
- (void)applicationWillResignActive:(NSNotification *)notification;

@end

 

 

#import "PersistenceViewController.h"
#import "FourLines.h"

@implementation PersistenceViewController

@synthesize field1;
@synthesize field2;
@synthesize field3;
@synthesize field4;


- (NSString *)dataFilePath{
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *documentsDirectory = [paths objectAtIndex:0];
 NSLog(@"Document Path:%@",documentsDirectory);
 return [documentsDirectory stringByAppendingPathComponent:kFilename];
}
/*
// The designated initializer. Override to perform setup that is required before the view is loaded.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}
*/

/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
}
*/

 

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
 NSString *filePath = [self dataFilePath];
 if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
  /*
  NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
  field1.text = [array objectAtIndex:0];
  field2.text = [array objectAtIndex:1];
  field3.text = [array objectAtIndex:2];
  field4.text = [array objectAtIndex:3];
  [array release];
  */
  
   //encoding
  NSData *data = [[NSMutableData alloc] initWithContentsOfFile:filePath];
  NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
  
  FourLines *fourLines = [unarchiver decodeObjectForKey:kDataKey];
  [unarchiver finishDecoding];
  
  field1.text = fourLines.field1;
  field2.text = fourLines.field2;
  field3.text = fourLines.field3;
  field4.text = fourLines.field4;
  
  [unarchiver release];
  [data release];
 }
 
 UIApplication *app = [UIApplication sharedApplication];
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app];
    [super viewDidLoad];
}

- (void) applicationWillResignActive:(NSNotification *)notification{
 /*
 NSMutableArray *array = [[NSMutableArray alloc] init];
 [array addObject:field1.text];
 [array addObject:field2.text];
 [array addObject:field3.text];
 [array addObject:field4.text];
 [array writeToFile:[self dataFilePath] atomically:YES];
 */
 FourLines *fourLine = [[FourLines alloc] init];
 fourLine.field1 = field1.text;
 fourLine.field2 = field2.text;
 fourLine.field3 = field3.text;
 fourLine.field4 = field4.text;
 
 NSMutableData *data = [[NSMutableData alloc] init];
 NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
 [archiver encodeObject:fourLine forKey:kDataKey];
 [archiver finishEncoding];
 [data writeToFile:[self dataFilePath] atomically:YES];
 [fourLine release];
 [data release];
 [archiver release];
}

// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

- (void)didReceiveMemoryWarning {
 // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
 
 // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
 // Release any retained subviews of the main view.
 // e.g. self.myOutlet = nil;
}


- (void)dealloc {
 [field1 release];
 [field2 release];
 [field3 release];
 [field4 release];
    [super dealloc];
}

@end 

posted on 2012-03-26 18:04  心不蒙尘  阅读(2236)  评论(0编辑  收藏  举报