需要使用NSCoder encodeObject:/ decodeObject添加其他对象

时间:2011-05-15 05:30:43

标签: objective-c cocoa serialization

所以我有一个使用旧式encodeObject:/ decodeObject NSCoder序列化的项目。我需要在序列化过程中添加一个新对象,但之前保存的文档会因为decodeObject尝试解码那些尚未存在的东西而崩溃。

-(void) encodeWithCoder:(NSCoder *)aCoder {
    [super encodeWithCoder:aCoder];
    [aCoder encodeObject:existingArray];
    [aCoder encodeObject:anotherExistingArray];

    [aCoder encodeObject:myNewArray];
}

-(id) initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if( self != nil ) {
        NSArray *_existingArray = [aDecoder decodeObject];
        NSArray *_anotherExistingArray = [aDecoder decodeObject];

        // We crash here, this object doesn't exist in documents saved with only the first two arrays
        NSArray *_myNewArray = [aDecoder decodeObject]; 
    }
    return( self );
}

我认为我无法将其转换为密钥存档并保持与以前保存的存档的兼容性(这是一项要求)。试图捕获抛出的异常似乎也没有帮助。

有什么想法吗?

更新:呸,为什么当你问一个问题时,你几乎可以立即找到答案?

此类已正确版本化。以前的作者在版本检查中有错误。所以为了完整性:

+ (void) initialize {
    if( self == [MyClass class] ) {
        [self setVersion:2]; // was 1
    }
}

-(void) encodeWithCoder:(NSCoder *)aCoder {
    [super encodeWithCoder:aCoder];
    [aCoder encodeObject:existingArray];
    [aCoder encodeObject:anotherExistingArray];
    [aCoder encodeObject:myNewArray];
}

-(id) initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    int version = [aDecoder versionForClassName:@"MyClass"];
    if( self != nil ) {
        NSArray *_existingArray = [aDecoder decodeObject];
        NSArray *_anotherExistingArray = [aDecoder decodeObject];

        if( version > 1 ) {
            NSArray *_myNewArray = [aDecoder decodeObject]; 
        }
    }
    return( self );
}

1 个答案:

答案 0 :(得分:1)

继续使用串行存档读取旧文件(只读) 使用键控归档程序加载和保存新文件,检测方式为:

[NSCoder allowsKeyedCoding]