如何将GTLDriveFile对象序列化/反序列化为pList

时间:2014-04-25 13:44:02

标签: ios objective-c google-drive-api nskeyedarchiver nscoding

我在我的应用程序中使用谷歌驱动器文件。访问文件,下载文件,上传文件都是一种魅力。现在,我正在尝试使用NSCoding将GTLDriveFile信息保存在本地(pList)上。你能帮我把这些信息保存到pList中,或者建议在本地存储这些信息的最佳方法吗

遵循的步骤:

  1. Google身份验证 - 已完成
  2. 查询文件 - 已完成
  3. 尝试将所有文​​件信息保存到pList中 - 我现在在这里
  4. 请参阅此链接以获取 GTLDriveFile 类结构 https://developers.google.com/drive/ios/reference/ios-client/interface_g_t_l_drive_file

    我试过这种方式,但我无法将整个结构保存到其中。

    对于Ex:.h文件

    #import "GTLDriveFile.h"
    
    @interface sample : GTLDriveFile <NSCoding>
    
    @end
    

    .m文件

    #import "sample.h"
    
    @implementation sample
    
    //@synthesize File;
    
    - (id)initWithCoder:(NSCoder *)aDecoder
    {
        if(self = [super init])    {
             super.fileSize=[aDecoder decodeObjectForKey:@"fileSize"];
             super.originalFilename=[aDecoder decodeObjectForKey:@"originalFilename"];
             super.mimeType=[aDecoder decodeObjectForKey:@"mimeType"];
             super.title=[aDecoder decodeObjectForKey:@"title"];
             **super.parents=[aDecoder decodeObjectForKey:@"parents"];**
             super.lastModifyingUserName=[aDecoder decodeObjectForKey:@"lastModifyingUserName"];
             **super.copyable=[aDecoder decodeObjectForKey:@"copyable"];**
             super.kind=[aDecoder decodeObjectForKey:@"kind"];
             super.writersCanShare=[aDecoder decodeObjectForKey:@"writersCanShare"];
             **super.appDataContents=[aDecoder decodeObjectForKey:@"appDataContents"];
             super.modifiedDate=[aDecoder decodeObjectForKey:@"modifiedDate"];**
        }
        return self;
    }
    
    - (void)encodeWithCoder:(NSCoder *)encoder
    {
        [encoder encodeObject: super.fileSize forKey:@"fileSize"];
        [encoder encodeObject: super.originalFilename forKey:@"originalFilename"];
        [encoder encodeObject: super.mimeType forKey:@"mimeType"];
        [encoder encodeObject: super.title forKey:@"title"];
        **[encoder encodeObject: super.parents forKey:@"parents"];**
        [encoder encodeObject: super.lastModifyingUserName forKey:@"lastModifyingUserName"];
        **[encoder encodeObject:copyable forKey:@"copyable"];**
        [encoder encodeObject: super.kind forKey:@"kind"];
        [encoder encodeObject: super.writersCanShare forKey:@"writersCanShare"];
        **[encoder encodeObject:appDataContents forKey:@"appDataContents"];**
        **[encoder encodeObject: super.modifiedDate forKey:@"modifiedDate"];**
    }
    
    @end
    

    问题是,我无法序列化/反序列化NSString,NSNUMBER等直接值。当我尝试某些基础对象如“ copyable ”时,我就是获得异常(请参阅粗体对象或参考上面链接中的GTLDriveFile类参考)。

    大家好,请帮我把这些信息保存到当地,并建议最好的方法。

    由于

2 个答案:

答案 0 :(得分:1)

所以Cocoa框架类支持NSCoding。在这些类中,有些是“普通”类(如NSString),它们支持所需的一切。有些是“复杂”类(如NSArray),其中包含其他类的实例 - 在这种情况下,所有包含的对象必须支持NSCoding才能使编码正常工作

您要编码/解码的任何非框架类,您需要指定它符合NSCoding并且您需要编写协议方法的实现(如果合适,调用super

答案 1 :(得分:1)

在上面的一条评论中,您有效地建议了以下NSCoder方法(显然假设您正在处理只有两个属性namearray)的对象:

- (id)initWithCoder:(NSCoder *)aDecoder {
    if ((self = [super init])) {
        self.name  = [aDecoder decodeObjectForKey:@"name"];
        self.array = [aDecoder decodeObjectForKey:@"array"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:self.name  forKey:@"name"];
    [encoder encodeObject:self.array forKey:@"array"]; 
}

如果超类本身不符合NSCoder,那基本上是正确的。但如果super符合NSCoder,那么你也必须给它机会施展它的魔力:

- (id)initWithCoder:(NSCoder *)aDecoder {
    if ((self = [super initWithCoder:aDecoder])) {
        self.name  = [aDecoder decodeObjectForKey:@"name"];
        self.array = [aDecoder decodeObjectForKey:@"array"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {
    [super encodeWithCoder:encoder];

    [encoder encodeObject:self.name  forKey:@"name"];
    [encoder encodeObject:self.array forKey:@"array"];
}

如果你是一个自定义对象的子类(例如,是GTLObject还是你自己的一个类),那么使用它也很重要,这也符合NSCoder。并且您必须在将包含在存档中的所有类中重复上述模式。但是Cocoa类(如NSArray)已经符合NSCoder,所以你只需要担心自己的类。