Objective c 使用encodeRootObject:取消归档已归档内容的正确方法是什么?

Objective c 使用encodeRootObject:取消归档已归档内容的正确方法是什么?,objective-c,nscoder,Objective C,Nscoder,我第一次尝试使用键控Archiver类,但在这个简单测试(OCUnit)中最后一次断言失败: 我已经确认归档员正在归档,我假设问题存在于未归档中。 根据我的观点,我相信我如何使用Unarchiver可能存在一些问题 谢谢 首先,您不应该使用encodeRootObject方法。这是NSCoder中定义的传统方法,用于支持过时的非键控归档程序,并且只能使用decodeObject:进行解码。您仅使用encodeObjectForKey:和decodeObjectForKey:对 所以 应该是 i

我第一次尝试使用键控Archiver类,但在这个简单测试(OCUnit)中最后一次断言失败:

我已经确认归档员正在归档,我假设问题存在于未归档中。 根据我的观点,我相信我如何使用Unarchiver可能存在一些问题


谢谢

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

所以

应该是

 id decodedEntity = [bua decodeObjectForKey:@"testKey"];
如果你想解码字典的全部,而不是

[ba encodeRootObject:dict];

顺便说一句,出于简单目的,通常只需使用
NSUserDefaults
,它会自动创建要写入的文件,在文件上写入内容,并在下次启动程序时读取

如果您只需要对字典进行编码,使用通常就足够了


如果您确实使用了
NSKeyedArchiver
nskeyedunachiver
,我建议您按照惯例为对象编写
encodeWithCoder:
initWithCoder:

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

    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);
    }
所以

应该是

 id decodedEntity = [bua decodeObjectForKey:@"testKey"];
如果你想解码字典的全部,而不是

[ba encodeRootObject:dict];

顺便说一句,出于简单目的,通常只需使用
NSUserDefaults
,它会自动创建要写入的文件,在文件上写入内容,并在下次启动程序时读取

如果您只需要对字典进行编码,使用通常就足够了

如果您确实使用了
NSKeyedArchiver
NSKeyedUnarchiver
,我建议您按照实践,为对象编写
encodeWithCoder:
initWithCoder:

NSUserDefaults*defaults=[NSUserDefaults standardUserDefaults];
    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);
    }
id profileData=[defaults dataForKey:kProfileDataKey];//或者你可以从网上得到 if(profileData&[profileData是类:[NSData类]]{ NSKeyedUnarchiver*unarchiver=[[NSKeyedUnarchiver alloc]initForReadingWithData:(NSData*)profileData]; unarchiver.requirescurecoding=是;// id对象=[unarchiver decodeObjectOfClass:[MyClass类]forKey:NSKeyedArchiveRootObjectKey]; NSLog(@“%@”,对象); }
NSUserDefaults*默认值=[NSUserDefaults standardUserDefaults];
id profileData=[defaults dataForKey:kProfileDataKey];//或者你可以从网上得到
if(profileData&[profileData是类:[NSData类]]{
NSKeyedUnarchiver*unarchiver=[[NSKeyedUnarchiver alloc]initForReadingWithData:(NSData*)profileData];
unarchiver.requirescurecoding=是;//
id对象=[unarchiver decodeObjectOfClass:[MyClass类]forKey:NSKeyedArchiveRootObjectKey];
NSLog(@“%@”,对象);
}

对不起,这还没有通过,我不是想得到字符串“hello”,而是想得到字典。为了回答您的问题,上面链接页面的底部显示:如果您想自定义以前使用archiveRootObject:toFile:创建的存档的非存档过程,您可以使用decodeObjectForKey:和键“root”来标识存档中的根对象。感谢有关NSUserDefaults的提示。这个测试是为了一个更复杂的酸洗子系统,我正在写,tho。NSUserDefaults不够。好吧,但是您没有使用
archiveRootObject:toFile:
,是吗?正确!所以我想我要问的问题是:使用encodeRootObject:取消归档的正确方法是什么?编辑:没有注意到您修改了答案的上述部分。不使用encodeRootObject对我来说是个有趣的消息,谢谢!我将尝试你的建议。我不想使用encodeObject,因为它看起来好像文档中说encodeRootObject:是编码对象的方法,如果我想得到正确的引用。很晚了,明天早上我会去拿的,再次谢谢。对不起,那没有通过,我不是想得到字符串“你好”,我是想得到字典。为了回答您的问题,上面链接页面的底部显示:如果您想自定义以前使用archiveRootObject:toFile:创建的存档的非存档过程,您可以使用decodeObjectForKey:和键“root”来标识存档中的根对象。感谢有关NSUserDefaults的提示。这个测试是为了一个更复杂的酸洗子系统,我正在写,tho。NSUserDefaults不够。好吧,但是您没有使用
archiveRootObject:toFile:
,是吗?正确!所以我想我要问的问题是:使用encodeRootObject:取消归档的正确方法是什么?编辑:没有注意到您修改了答案的上述部分。不使用encodeRootObject对我来说是个有趣的消息,谢谢!我将尝试你的建议。我不想使用encodeObject,因为它看起来好像文档中说encodeRootObject:是编码对象的方法,如果我想得到正确的引用。很晚了,我明天早上再拿,再次感谢。