无论对象类型如何,NSKeyedArchiver 都会序列化整个对象层次结构吗?

Will NSKeyedArchiver serialize the whole object hierarchy regardless of object type?

如果我将超级 class 对象传递给 -archivedDataWithRootObject:,但该对象包含所述超级 class 的子 class;整个对象图将被序列化以包含 subclass 的实例变量,还是仅包含与 superclass 相关的实例变量?

示例:

@interface Mammal : NSObject

@property (nonatomic, copy) NSString *species;

@end

@interface Person : Mammal

@property (nonatomic, copy) NSString *name;

@end

Person *person = [[Person alloc] init];
person.species = @"Human";
person.name = @"Michael";

Mammal *mammal = person;

NSData *personData = [NSKeyedArchiver archivedDataWithRootObject:mammal];

未归档的数据是否只包含哺乳动物实例变量?

首先,保存对象指针的变量的静态类型在编译后完全没有关系。也就是说,mammal 变量被声明为指向 Mammal 的指针这一事实仅在编译时用于检查内容。该事实不会在编译后的程序中存在,也不会影响 运行 时间的行为。

其次,NSKeyedArchiver 及其 +archivedDataWithRootObject: 方法都不知道如何归档传入的对象。它们依赖于知道如何归档自身的对象。对象必须是符合 NSCoding 协议的类型。它的 class 必须实现 -encodeWithCoder: 方法。对象的具体情况 encoded/archived 完全取决于该方法的实现。

因此,MammalPerson 都必须覆盖该方法来为各自的 class 编码特定数据,以便正确存档。

一旦他们这样做,方法调用的正常动态分派将导致在传递给 +archivedDataWithRootObject: 的对象上调用正确的方法调用。同样,这取决于对象的动态类型,而不是包含指向它的指针的变量的静态类型。