注册 登录
主题 : 自动序列化
级别: 侠客
UID: 5845
精华: 0
发帖: 16
可可豆: 2162 CB
威望: 2162 点
在线时间: 450(时)
注册时间: 2009-05-19
最后登录: 2015-11-26
0 楼:  发表于: 2010-10-16 17:32    发自: Web Page
来源于 通用代码 分类

自动序列化    (在iOS代码库中浏览本帖)

想要对对象进行序列化,就要实现相应encode decode方法。如果对象多的话,实在是个体力活。我能想到的有两种方法,一用runtime;二用脚本去生成相应的方法。
这是第一种,有些地方写的不够好,也许还有些问题,但基本可用。大家帮忙测一下,有问题的话通知我。

[attachment=16463]

//
//  NSObeject+AutoEncodeDecode.m
//  AutoEncode
//
//  Created by durian on 10/1/10.
//  Copyright 2010 D&O. All rights reserved.
//

#import "NSObject+AutoEncodeDecode.h"
#include 
#include 


@implementation NSObject (AutoEncodeDecode)

- (void)encodeWithCoder:(NSCoder *)encoder {
    Class cls = [self class];
    while (cls != [NSObject class]) {
        unsigned int numberOfIvars = 0;
        Ivar* ivars = class_copyIvarList(cls, &numberOfIvars);
        for(const Ivar* p = ivars; p < ivars+numberOfIvars; p++){
            Ivar const ivar = *p;
            const char *type = ivar_getTypeEncoding(ivar);
            NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
            id value = [self valueForKey:key];
            if (value) {
                switch (type[0]) {
                    case _C_STRUCT_B: {
                        NSUInteger ivarSize = 0;
                        NSUInteger ivarAlignment = 0;
                        NSGetSizeAndAlignment(type, &ivarSize, &ivarAlignment);                
                        NSData *data = [NSData dataWithBytes:(const char *)self + ivar_getOffset(ivar)
                                                      length:ivarSize];
                        [encoder encodeObject:data forKey:key];
                    }
                        break;
                    default:
                        [encoder encodeObject:value
                                       forKey:key];
                        break;
                }                        
            }
        }    
    free(ivars);
        cls = class_getSuperclass(cls);
    }
}

- (id)initWithCoder:(NSCoder *)decoder {
    self = [self init];
    
    if (self) {
        Class cls = [self class];
        while (cls != [NSObject class]) {
            unsigned int numberOfIvars = 0;
            Ivar* ivars = class_copyIvarList(cls, &numberOfIvars);
            
            for(const Ivar* p = ivars; p < ivars+numberOfIvars; p++){
                Ivar const ivar = *p;
                const char *type = ivar_getTypeEncoding(ivar);
                NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
                id value = [decoder decodeObjectForKey:key];
                if (value) {
                    switch (type[0]) {
                        case _C_STRUCT_B: {
                            NSUInteger ivarSize = 0;
                            NSUInteger ivarAlignment = 0;
                            NSGetSizeAndAlignment(type, &ivarSize, &ivarAlignment);                
                            NSData *data = [decoder decodeObjectForKey:key];
                            char *sourceIvarLocation = (char*)self+ ivar_getOffset(ivar);                                 
                            [data getBytes:sourceIvarLocation length:ivarSize];
                        }
                            break;
                        default:
                            [self setValue:[decoder decodeObjectForKey:key]
                                    forKey:key];
                            break;
                    }
                }            
            }
      free(ivars);      
            cls = class_getSuperclass(cls);
        }
    }
    
    return self;
}


@end



AutoEncodeDecode.zip (31 K) 下载次数:131
[ 此帖被durian在2011-09-20 20:30重新编辑 ]

级别: 版主

状态: 连续签到 - [144天]
UID: 491
精华: 6
发帖: 1763
可可豆: 112160 CB
威望: 112807 点
在线时间: 8537(时)
注册时间: 2008-08-19
最后登录: 2019-05-19
1 楼:  发表于: 2010-10-16 17:38    发自: Web Page
2010-10-16 17:37:41.364 AutoEncodeDecode[10263:a0b] dog:a niu , year:6, size:(50, 30), service count:10
2010-10-16 17:37:41.366 AutoEncodeDecode[10263:a0b] dog:a niu , year:6, size:(50, 30), service count:10
Running…

真强!膜拜牛人
 Developer
------------------------------------------------------------
Η αγάπη ποτέ δεν αποτυγχάνει.
愛是永不止息。
Love never fails.

    --《圣经.新约》哥林多前书第13章
级别: 新手上路
UID: 17773
精华: 0
发帖: 18
可可豆: 263 CB
威望: 153 点
在线时间: 114(时)
注册时间: 2010-04-17
最后登录: 2017-12-07
2 楼:  发表于: 2010-11-08 11:26    发自: Web Page
强人啊! 有什么runtime的资料可以介绍一下的, 谢谢
级别: 新手上路
UID: 1881
精华: 0
发帖: 7
可可豆: 423 CB
威望: 423 点
在线时间: 297(时)
注册时间: 2009-01-13
最后登录: 2016-03-27
3 楼:  发表于: 2010-12-15 16:00    发自: Web Page
基础很好啊
级别: 精灵王

状态: 连续签到 - [3天]
UID: 11513
精华: 0
发帖: 727
可可豆: 6360 CB
威望: 6354 点
在线时间: 1200(时)
注册时间: 2009-12-10
最后登录: 2019-11-08
4 楼:  发表于: 2010-12-16 15:10    发自: Web Page
牛人  
人不怕走在黑夜里,就怕心中没有阳光


级别: 骑士
UID: 12248
精华: 0
发帖: 219
可可豆: 2059 CB
威望: 2059 点
在线时间: 1288(时)
注册时间: 2009-12-25
最后登录: 2019-11-15
5 楼:  发表于: 2011-03-01 17:14    发自: Web Page
这个俺也会的
级别: 精灵王
UID: 86929
精华: 0
发帖: 496
可可豆: 4476 CB
威望: 4476 点
在线时间: 89(时)
注册时间: 2011-08-13
最后登录: 2018-08-21
6 楼:  发表于: 2012-09-25 02:24    发自: Web Page
Mark下,牛人呐
欢迎关注我的博客 http://blog.saick.net
实力、实干、实际。
级别: 侠客
UID: 84403
精华: 0
发帖: 96
可可豆: 676 CB
威望: 676 点
在线时间: 114(时)
注册时间: 2011-07-31
最后登录: 2018-07-31
7 楼:  发表于: 2014-02-25 10:38    发自: Web Page

  楼主问下 case  _C_CTRUCT_B  这句干么的么?我以前自学的时候写过一个东西,代码如下 有什么问题 交流下呗。

-(id)initWithCoder:(NSCoder *)aDecoder{
    if (self=[super init]) {
        unsigned int outCount, i;
        objc_property_t *properties = class_copyPropertyList([self class], &outCount);
        for(i = 0; i < outCount; i++) {
            objc_property_t property = properties;
            NSString *key=[[[NSString alloc]initWithCString:property_getName(property) encoding:NSUTF8StringEncoding]autorelease];
            [self setValue: [aDecoder decodeObjectForKey:key]forKey:key];
        }
    
        free(properties);

    }
    return self;
}
-(void)encodeWithCoder:(NSCoder *)aCoder{
    unsigned int outCount, i;
    objc_property_t *properties = class_copyPropertyList([self class], &outCount);
    
    for(i = 0; i < outCount; i++) {
        objc_property_t property = properties;
        NSString *key=[[[NSString alloc]initWithCString:property_getName(property) encoding:NSUTF8StringEncoding]autorelease];
         [aCoder encodeObject:[self valueForKey:key] forKey:key ];
        
    }
    free(properties);

}

CocoaChina社区转载内容已尽可能注明出处,如未能核实来源或转发内容图片有权利瑕疵的,请及时联系社区进行修改或删除【联系方式QQ : 3442093904 邮箱:support@cocoachina.com】文章内容为作者独立观点,不代表CocoaChina社区立场。版权归原作者所有,如申请授权请联系作者,因文章侵权CocoaChina社区不承担任何法律及连带责任。

描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部