【问题标题】:NSKeyedUnarchiver Always Returns nilNSKeyedUnarchiver 总是返回 nil
【发布时间】:2021-04-09 13:32:06
【问题描述】:

我正在尝试使用 NSKeyedArchiver 在应用关闭和电源循环之间存储数据。我试图存储的根对象是一个 NSMutableArray,但其中有 Foundation 和 Custom 对象的集合(所有这些都符合 NSCoding)。

文件保存代码如下

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fullFileName = [NSString stringWithFormat:@"%@/sessionDataSaveFile",documentsDirectory];
    
NSMutableData *pData = [[NSMutableData alloc] init];
    
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initRequiringSecureCoding:NO];
[archiver encodeObject:self.sessionData];
[archiver finishEncoding];
[pData appendData:[archiver encodedData]];
[pData writeToFile:fullFileName atomically:YES];

文件保存良好,没有抛出异常。再次启动应用程序时,使用以下代码恢复此文件。

NSArray *paths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fullFileName = [NSString stringWithFormat:@"%@/sessionDataSaveFile", documentsDirectory];

NSData *pData = [[NSData alloc] initWithContentsOfFile:fullFileName];
NSError *error = nil;
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:pData error:&error];
self.sessionData = [unArchiver decodeObject];
[unArchiver finishDecoding];

此时,sessionData 始终为 nil,但 pData 有几千字节长,因此我知道问题出在解码方法上。我已经尝试过[[NSMutableArray alloc] initWithCoder] 以及 NSKeyedUnarchiver 方法的几乎所有变体,但仍然没有用。我哪里错了?

【问题讨论】:

  • 既然已经有NSData,为什么还要使用NSKeyedArchiver
  • 你是什么意思?我可以将 NSData 直接写入文件而不使用 NSKeyedArchiver 从 NSMutableArray 转换吗?
  • 我不明白你为什么使用NSKeyedArchiver & NSKeyedUnarchiver。我会这样做:[self.sessionData writeToFile:fullFileName atomically:YES] & self.sessionData = [[NSData alloc] initWithContentsOfFile:fullFileName];
  • 抱歉,应该澄清一下 - self.sessionData 是 NSMutableArray。我刚刚尝试了以下方法。写:NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *fullFileName = [NSString stringWithFormat:@"%@/sessionDataSaveFile",documentsDirectory];self.sessionData = [[NSMutableArray alloc] initWithContentsOfFile:fullFileName]; if(self.sessionData == nil){ self.sessionData = [[NSMutableArray alloc] init]; } 运气不好!
  • [NSKeyedarchived archivedDataWithRootObject:self.sessionData requiringSecureCoding:YES error:&error]; 那么呢?另外,error param 在通话后不为零吗?

标签: ios objective-c nskeyedunarchiver


【解决方案1】:

解决了!

切换到使用NSFileManager 并在数组和数据之间进行简单交换以存储在特定路径中。

【讨论】:

    猜你喜欢
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 2015-03-05
    • 2014-08-25
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多