繁体   English   中英

解压缩使用encodeRootObject:归档的内容的正确方法是什么?

[英]What is the correct way to unarchive something that was archived using encodeRootObject:?

我尝试首次使用Keyed Archiver类,但在此简单测试(OCUnit)中,我未通过最后一个断言:

- (void) testNSCoding
{
    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:5];
    [dict setObject:@"hello" forKey:@"testKey"];

    NSMutableData* data = [NSMutableData data];
    NSKeyedArchiver *ba = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [ba encodeRootObject:dict];
    [ba finishEncoding];

    STAssertTrue(data.length != 0, @"Archiver gave us nothing.");

    NSKeyedUnarchiver *bua = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    id decodedEntity = [bua decodeObjectForKey:@"root"];
    [bua finishDecoding];
    STAssertNotNil(decodedEntity, @"Unarchiver gave us nothing.");
}

我已经确认归档程序正在归档,我假设问题在归档中存在。 根据《 档案和序列化指南》,我认为我如何使用Unarchiver可能存在一些问题?

谢谢!

首先,您不应使用encodeRootObject方法。 这是NSCoder定义的传统方法,用于支持过时的非键存档程序,并且只能使用decodeObject:进行解码。 您只能使用一对encodeObjectForKey:decodeObjectForKey:

所以,

 id decodedEntity = [bua decodeObjectForKey:@"root"];

应该

 id decodedEntity = [bua decodeObjectForKey:@"testKey"];

如果要解码字典的全部,而不是

[ba encodeRootObject:dict];

[ba encodeObject:dict forKey:@"root"];

顺便说一句,出于简单的目的,通常使用NSUserDefaults就足够了,它会自动负责创建要写入的文件,在文件上写东西以及在下次启动程序时读取它。

如果只需要对字典进行编码, NSPropertyListSerialization通常可以使用NSPropertyListSerialization

如果确实使用NSKeyedArchiverNSKeyedUnarchiver ,则建议您遵循该惯例,并为对象编写encodeWithCoder:initWithCoder: encodeWithCoder:

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    id profileData = [defaults dataForKey:kProfileDataKey]; // or you can get it from the web
    if (profileData && [profileData isKindOfClass:[NSData class]]) {
        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:(NSData *)profileData];
        unarchiver.requiresSecureCoding = YES; // <NSSecureCoding>
        id object = [unarchiver decodeObjectOfClass:[MyClass class] forKey:NSKeyedArchiveRootObjectKey];
        NSLog(@"%@", object);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM