佳为好友

原:ObjC的编解码文件解析 (序列化文件)

创建:2011.06.14

ObjC编码有一种需求,即同一个对象只能编码一次,无论它被引用了多少次。因此,编码文件的结构,和代码中类的结构并不相同,也不够直观。

为了达到上述目的,直观的做法是:
#将所有的对象全部列出到一个数组中。
#每个对象的成员变量写出成员变量名,但是,它的值要指向上述数组中的索引。
#如果多个对象引用了一个对象,那么该对象值在数组中生成一次,而其它则都是指向它的索引。

举个实例说明一下:
#定义一个类A。
@interface A : NSObject {
    NSString *mStr;
    NSString *m2Str;
    int mInt;
}
@end
#将生成的plist文件是UTF8编码,但是没有BOM信息,可以使用TextWrangler来加入一个BOM。这样FireFox就能 识别了。
#将文件改名为xml。
#拖拽到Firefox中打开。
#内容如下:(我加了注释)

<plist version="1.0">   
<dict>
    <key>$archiver</key>                            // 1.略
    <string>NSKeyedArchiver</string>
    <key>$objects</key>                             // 2.很重要,下面详细叙述。
    <array>                                                   // 
        <string>$null</string>                      // 2.0 对象0:string对象,值为null。
        <dict>                                                // 2.1 a对象。
            <key>$class</key>                       // 该对象的类(即A)的对象的索引。
            <dict>
                <key>CF$UID</key>
                <integer>4</integer>                // 指明A的信息在“4”中。即2.4中。
            </dict>
            <key>m2Str</key>                        // m2Str的信息。
            <dict>
                <key>CF$UID</key>
                <integer>3</integer>                // 指明A的信息在“3”中。即2.3中。
            </dict>
            <key>mInt</key>                         // mInt的信息。
            <integer>123456</integer>
            <key>mStr</key>                         // mStr的信息。
            <dict>
                <key>CF$UID</key>
                <integer>2</integer>                // 指明A的信息在“3”中。即2.2中。
            </dict>
        </dict>
        <string>String111</string>                  // 2.2
        <string>String222</string>                  // 2.3
        <dict>                                      // 2.4 列出A对象的类的信息。
            <key>$classes</key>                     // 2.4.0 A对象的父类。
            <array>
                <string>A</string>
                <string>NSObject</string>
            </array>
            <key>$classname</key>                   // 2.4.1 A对象的类名。
            <string>A</string>
        </dict>
    </array>
    <key>$top</key>                                 // 3.略
    <dict>
        <key>root</key>
        <dict>
            <key>CF$UID</key>
            <integer>1</integer>
        </dict>
    </dict>
    <key>$version</key>                             // 4.略
    <integer>100000</integer>
</dict>
</plist>



array编码了所有的对象。类型也编码为一种对象。
array的顶层子节点列出所有的NSObject的派生类对象
第一个都是<string>$null</string>,不考虑它。
第二个是Root对象。即[NSKeyedArchiver archivedDataWithRootObject:a];中的a。
array的其他的顶层子节点都是Root对象中直接或简介关联到的对象,即要编码的全部对象。
如果是内建的NSObject的类型,例如NSString,则直接列出其值, 如<string>String222</string>
如果不是内建的NSObject的派生类的类型,则又是一个<dict>。

每个对象都首先列出该对象类型在array的索引,然后依次是各个成员变量。

成员变量列出名字。如果值是非NSObject型,则直接列出值。否则指向array的索引。

#依次类推。

+++++

posted on 2012-12-30 10:27 佳为好友 阅读(291) 评论(0)  编辑 收藏 引用 所属分类: 非UI


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2012年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

留言簿(1)

随笔分类

搜索

最新评论

评论排行榜