Zuerst etwas Geschichte:
Ältere Versionen der Objective-C-Laufzeit (Pre-OS X) enthalten eine Pseudo-Klasse NXTypedStream genannt, die die Pre-OPEN Vorfahren des NSCoder ist. Ältere Versionen von Foundation enthielten einen Header namens NSCompatibility.h, der Funktionen und Kategorien für den Umgang mit alten NeXTStep-Formaten enthielt. NSCompatibility.h existiert nicht mehr, aber ein (veraltet) subset dieser Funktionalität kann noch in NSCoder.h gefunden werden.
NSCoder debütierte als Teil des ursprünglichen Foundation Kit in OPENSTEP, verwendete aber wahrscheinlich typedstreams als Serialisierungsformat. Irgendwann wurde es auf ein plistenbasiertes Format umgestellt. Die aktuelle Version von Interface Builder (als Teil der Xcode) ist noch in der Lage älter, typedstream-basierte NIBs zu lesen, das ist ein guter Anhaltspunkt ist, dass diese Funktionalität noch existiert in OS X.
nun die Lösung:
Ich kann dies in keiner (aktuellen) Apple-Dokumentation finden, aber es stellt sich heraus, dass NSCoder/NSUnarchiver immer noch typedstream-Dateien gut lesen kann. Wenn Sie eine Datei in einem typedstream Cocoa/Objective-C-Programm lesen möchten, tun nur dies:
NSUnarchiver *typedStreamUnarchiver = [[NSUnarchiver alloc] initForReadingWithData:[NSData dataWithContentsOfFile:@"<path to your typedstream file>"]];
Das ist es! Die Decodierung wird intern in einer Funktion namens _decodeObject_old behandelt. Jetzt können Sie mit Standard NSCoder Methoden aus dem Archiv entfernen, wie:
id object = [typedStreamUnarchiver decodeObject];
NSLog(@"Decoded object: %@", object);
Beachten Sie, dass, wenn die Klasse in der typedstream in Ihrem Programm keine gültige Klasse ist, wird es eine NSArchiverArchiveInconsistency Ausnahme auslösen.
Siehe auch: http://www.stone.com/The_Cocoa_Files/Legacy_File_Formats.html
Ja, das ist, was ich dachte. Glücklicherweise wurde das Dateiformat in XML geändert, was es nicht nur lesbarer macht, sondern tatsächlich * für Menschen lesbar *. –
Binär plist beginnt mit der Magie "bplist00". Getippter Stream scheint mit "<0x04><0x0b> Streamtyped" zu beginnen. Ich denke, es gibt kein generisches Deserialisierungswerkzeug für typisierte Objektströme? – jkj