我有一个格式如下的文件:
NeXT/Apple typedstream data, little endian, version 4, system 1000
在十六进制编辑器中查看它,它显然是由 NS对象(NSArray
,NSValue
等)组成的。它似乎也有一个嵌入式 plist!
我猜有一种简单的方法可以读取这个文件并以更易读的方式输出它(类似于repr()
or的输出print_r()
)。
我假设我需要使用 Objective-C 来做到这一点?
我有一个格式如下的文件:
NeXT/Apple typedstream data, little endian, version 4, system 1000
在十六进制编辑器中查看它,它显然是由 NS对象(NSArray
,NSValue
等)组成的。它似乎也有一个嵌入式 plist!
我猜有一种简单的方法可以读取这个文件并以更易读的方式输出它(类似于repr()
or的输出print_r()
)。
我假设我需要使用 Objective-C 来做到这一点?
首先,一些历史:
旧版本的 Objective-C 运行时(OS X 之前)包括一个名为NXTypedStream的伪类,它是 NSCoder 的 pre-OPENSTEP 祖先。旧版本的 Foundation 包含一个名为NSCompatibility.h的头文件,它具有处理旧的 NeXTStep 格式的函数和类别。NSCompatibility.h 不再存在,但仍然可以在 NSCoder.h 中找到该功能的(已弃用)子集。
NSCoder 在 OPENSTEP 中作为原始 Foundation Kit 的一部分首次亮相,但可能使用 typedstreams 作为其序列化格式。在某些时候,它被切换到基于 plist 的格式。当前版本的 Interface Builder(作为 Xcode 的一部分)仍然能够读取旧的、基于 typedstream 的 NIB,这是一个很好的线索,表明这个功能仍然存在于 OS X 中。
现在,解决方案:
我在任何(当前)Apple 文档中都找不到这个,但事实证明 NSCoder/NSUnarchiver 仍然可以很好地读取 typedstream 文件。如果您想在 Cocoa/Objective-C 程序中读取类型化流文件,只需执行以下操作:
NSUnarchiver *typedStreamUnarchiver = [[NSUnarchiver alloc] initForReadingWithData:[NSData dataWithContentsOfFile:@"<path to your typedstream file>"]];
就是这样!解码在名为 _decodeObject_old 的函数内部处理。现在您可以使用标准的 NSCoder方法取消归档,例如:
id object = [typedStreamUnarchiver decodeObject];
NSLog(@"Decoded object: %@", object);
请注意,如果 typedstream 中的类不是您程序中的有效类,它将抛出 NSArchiverArchiveInconsistency 异常。
另见: http: //www.stone.com/The_Cocoa_Files/Legacy_File_Formats.html
如果它是二进制 plist,使用 Xcode / Plist Editorplutil
或您自己的 Objective-C 代码应该很容易阅读。否则,根据文件的不同,它可能更具挑战性。该文件存储了 Objective-C 对象的序列化表示。因此,它仅供创建它的软件读取。