有没有办法以TypedStream格式读取文件

时间:2010-12-06 22:30:56

标签: objective-c file data-structures next

我有一个以下格式的文件:

NeXT/Apple typedstream data, little endian, version 4, system 1000

在十六进制编辑器中查看它,它显然由NS 某些对象(NSArrayNSValue等)组成。它似乎也有一个嵌入式plist!

我猜测有一种简单的方法可以读取此文件并以更易读的方式输出(类似于repr()print_r()的输出)。

我假设我需要使用Objective-C做这个?

2 个答案:

答案 0 :(得分:10)

首先,一些历史:

较早版本的Objective-C运行时(OS X之前版本)包含一个名为NXTypedStream的伪类,它是NSCoder的OPENSTEP前祖先。早期版本的Foundation包含一个名为NSCompatibility.h的标题,它具有处理旧NeXTStep格式的函数和类别。 NSCompatibility.h不再存在,但仍可在NSCoder.h中找到该功能的(已弃用)subset

NSCoder作为OPENSTEP中原始Foundation Kit的一部分首次亮相,但可能使用typedstreams作为其序列化格式。在某些时候,它被切换到基于plist的格式。当前版本的Interface Builder(作为Xcode的一部分)仍然能够读取较旧的基于类型流的NIB,这是OS X中仍然存在此功能的一个很好的线索。

现在,解决方案:

我在任何(当前的)Apple文档中都找不到这个,但事实证明NSCoder / NSUnarchiver仍然可以正常读取typedstream文件。如果您想在Cocoa / Objective-C程序中读取typedstream文件,请执行以下操作:

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

答案 1 :(得分:4)

如果它是二进制plist,使用Xcode / Plist Editor,plutil或您自己的Objective-C代码应该很容易阅读它。否则,根据文件,它可能更具挑战性。该文件存储Objective-C对象的序列化表示。因此,它只能由创建它的软件读取。

相关问题