1

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.");
}

アーカイバがアーカイブ中であることを確認しました。問題はアーカイブ解除に存在すると想定しています。Archives and Serializations Guideによると、Unarchiverの使用方法に問題があるのではないかと思います。

ありがとう!

4

2 に答える 2

1

まず、このメソッドを使用しない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通常は使用するだけで十分です。

NSKeyedArchiverとを使用する場合NSKeyedUnarchiverは、練習に従って、オブジェクトencodeWithCoder:を作成することをお勧めします。initWithCoder:

于 2011-05-09T04:46:12.200 に答える
0
    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);
    }
于 2014-05-27T12:15:41.470 に答える