仿造NSKeyedArchiver和NSKeyedUnrarchiver,对COCOS2DX数组对象归档

~~~~本文章为 OwenTsang(fromOld-Boys-Studio)原创,转载务必在明显处注明:

           原文连接:http://blog.csdn.net/owen_c/article/details/9750419

      Cocos2dx如何保存一个数据的数据呢?只对于初学者来说,总感觉有点麻烦,特别是从cocos2d-iphone转过来cocos2dx的同学们,更是很烦恼,在IOS中使用NSKeyedArchiverNSKeyedUnrarchiver就可以很容易地对数组的数据归档了,但初涉cocos2dx的同学感觉有点无措了,其实这果中方法很简单,就是加一个索引下标就可以了。闲话不叙,下面说说怎么加吧。

仿造NSCodingOBCoding

[cpp]  view plain copy
  1. class OBCoding: public CCObject  
  2. {  
  3. protected:  
  4.     OBCoding():CCObject(){}  
  5. public:  
  6.     virtual void encodeWithCoder(CCUserDefault* encoder,const char* primerKey = NULL) = 0;  
  7.     virtual OBCoding* initWithCoder(CCUserDefault* decoder,const char* primerKey = NULL) = 0;  
  8. };  

仿造NSKeyedArchiver宏

[cpp]  view plain copy
  1. #define OB_ARCHIVED_ARRAY(xmlWriter,arrayName,array) \  
  2.             {\  
  3.                 if(!xmlWriter ||!arrayName || !array)\  
  4.                 return;\  
  5.                 int count =array->count();\  
  6.                 xmlWriter->setIntegerForKey(CCString::createWithFormat("%s_count",arrayName)->getCString(),count);\  
  7.                 for(int i = 0; i < count ; ++i)\  
  8.                 {\  
  9.                     OBCoding* coder= (OBCoding*)array->objectAtIndex(i);\  
  10.                     coder->encodeWithCoder(xmlWriter,CCString::createWithFormat("%s_%d",arrayName,i)->getCString());\  
  11.                 }\  
  12.             }  

  3 仿造NSKeyedUnrarchiver宏

[cpp]  view plain copy
  1. #define OB_UNARCHIVED_ARRAY(unarchivedArray,xmlReader,arrayName,TYPE_NAME)\  
  2.             {\  
  3.                 if(!xmlReader ||!arrayName){\  
  4.                     unarchivedArray= NULL; \  
  5.                 }\  
  6.                 else{\  
  7.                     int count = 0; \  
  8.                     OBCoding* coder= NULL;\  
  9.                     count =xmlReader->getIntegerForKey(CCString::createWithFormat("%s_count",arrayName)->getCString(),count);\  
  10.                     if(count <= 0){\  
  11.                        unarchivedArray = NULL; \  
  12.                     }\  
  13.                     else{\  
  14.                        unarchivedArray = CCArray::createWithCapacity(count);\  
  15.                         for(int i = 0; i < count ; ++i)\  
  16.                         {\  
  17.                             coder =dynamic_cast<OBCoding*>(new TYPE_NAME());\  
  18.                            assert(coder);\  
  19.                             coder->initWithCoder(xmlReader,CCString::createWithFormat("%s_%d",arrayName,i)->getCString());\  
  20.                            unarchivedArray->addObject(coder);\  
  21.                            coder->release();\  
  22.                         }\  
  23.                     }\  
  24.                 }\  
  25.            }  

测试

    1) 归档打包:

[cpp]  view plain copy
  1. CCUserDefault* writer = CCUserDefault::sharedUserDefault();  
  2. OB_ARCHIVED_ARRAY(writer,"ClassOne",classOneArray);  
  3. writer->flush();  

    2)  归档解包

[cpp]  view plain copy
  1. CCArray*  classOneArray = NULL;  
  2. CCUserDefault* reader = CCUserDefault::sharedUserDefault();  
  3. OB_UNARCHIVED_ARRAY(classOneArray,reader,"ClassOne",Student);  

测试结果:

Cocos2d: enterfunction testArrayArchived()~~

Cocos2d: displayClass One students' detail now ~~

Cocos2d: id = 1,name = Owen1

Cocos2d: id = 2,name = Owen2

Cocos2d: id = 3,name = Owen3

Cocos2d: enterfunction testArrayUnarchived().....

Cocos2d: displayClass One students' detail now ~~

Cocos2d: id = 1,name = Owen1

Cocos2d: id = 2,name = Owen2

Cocos2d: id = 3, name = Owen3

源码及demo下载地址

https://github.com/OwenTsang/TestArrayArchived

~~~~本文章为 OwenTsang(fromOld-Boys-Studio)原创,转载务必在明显处注明:

           原文连接:http://blog.csdn.net/owen_c/article/details/9750419

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值