【问题标题】:Is there a way to read in files in TypedStream format有没有办法以 TypedStream 格式读取文件
【发布时间】:2011-05-21 06:31:47
【问题描述】:

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

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

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

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

我认为我需要使用 Objective-C 来做到这一点?

【问题讨论】:

    标签: objective-c file data-structures next


    【解决方案1】:

    首先,一些历史:

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

    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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,这就是我的想法。幸运的是,文件格式已更改为 XML,使其不仅更具可读性,而且实际上 人类可读
      • 二进制 plist 以神奇的“bplist00”开头。输入流似乎以“streamtyped”开头。我猜没有用于类型化对象流的通用反序列化工具?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 2022-08-04
      • 2019-06-29
      相关资源
      最近更新 更多