2010-12-06 53 views
9

我有以下格式的文件:有没有办法读取文件TypedStream格式

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

在十六进制编辑器看着它,它显然是由NS 东西对象(NSArrayNSValue等)。它也似乎有一个嵌入式plist!

我猜这里有一个直接的方式来读取这个文件并以一些更可读的方式输出它(类似于repr()print_r()的输出)。

我假设我需要使用Objective-C来做到这一点?

回答

4

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

+1

是的,这是我的想法。幸运的是,文件格式已被更改为XML,使其不仅更具可读性,而且实际上是*人可读*。 – 2011-05-31 04:32:34

8

首先,一些历史:Objective-C运行(预OS X)的

旧版本包括一个伪类称为NXTypedStream,这是NSCoder的OPENSTEP预祖先。较早版本的Foundation包含一个名为NSCompatibility.h的头文件,它具有处理旧NeXTStep格式的函数和类别。 NSCompatibility.h不再存在,但该功能的(不建议使用的)subset仍可在NSCoder.h中找到。

NSCoder作为OPENSTEP中原始基础套件的一部分首次亮相,但可能使用typedstreams作为其序列化格式。在某些时候,它被转换为基于plist的格式。当前版本接口生成器(如Xcode中的一部分)仍然能够读取旧的,基于typedstream-发钞银行,这是一个很好的线索,这个功能还是在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

相关问题