4

簡単にするために、次の単純なクラスインターフェイスがあると仮定します。

@interface Person : NSObject <NSCoding> {
  NSString *firstname;
  NSString *lastname;
}

@property (copy) NSString *firstname;
@property (copy) NSString *lastname;

@end

このオブジェクトをplistにシリアル化することは可能ですか(NSCodingプロトコルが正しく実装されていると仮定して)?

2010年12月31日14:40更新

これについてフォローアップの質問があります。NSKeyedArchiverplistをXMLとしてエクスポートすることは可能ですか?さらに、XMLをファイルではなく変数にダンプすることは可能ですか?

4

5 に答える 5

2

出力形式をXMLに設定することに関して、私は提案します:

[myKeyedArchiver setOutputFormat: NSPropertyListXMLFormat_v1_0];

ファイルではなく変数に取り込むことに関しては、initForWritingWithMutableData:initializerを使用してNSKeyedArchiverを作成することをお勧めします。エンコードが完了したら、必ずfinishEncodingを呼び出してください。そうすると、XMLは初期化時に渡したNSMutableDataに含まれます。

その後、そこからNSStringを取得する必要がある場合は、次のようにNSMutableDataから取得できます。

NSString* xmlString = [[NSString alloc] initWithData: myMutableData  encoding: NSUTF8StringEncoding];

それでうまくいくはずです。幸運を!

于 2010-12-31T14:47:33.313 に答える
0

はい、そうです。NSDataただし、最初にオブジェクトをエンコードしてから、plistに保存する配列/辞書にオブジェクトを保存する必要があるため、あまり便利ではありません。

于 2010-12-31T12:44:20.143 に答える
0

NSKeyedArchiverは、filename.plistファイルパスを指定すると、オブジェクトを自動的にplistに保存します。

于 2010-12-31T12:48:27.600 に答える
0

これはiOSの欠陥のようです。しかし、それがユーザーのデフォルトのplistの処理に固有のものであるかどうか疑問に思っています。

考えられる回避策として、設定に合わせてNSMutableDictionaryを管理し、辞書をplistファイルとして直接読み取り/書き込みしてみてください。

データを書き込むには:

NSString* error;
NSData* pListData = [NSPropertyListSerialization dataFromPropertyList:settingsDictionary format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];
[data writeToFile:settingsFilePath atomically:YES];

次に、データを読み戻します。

NSString* error;
NSData* pListData = [NSData dataWithContentsOfFile:settingsFilePath];
settingsDictionary = [NSPropertyListSerialization propertyListFromData:pListData mutabilityOption:NSPropertyListImmutable format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];
于 2011-05-27T18:12:50.243 に答える
0

この魔法を試してください:

NSData* data = [NSKeyedArchiver archivedDataWithRootObject:person];

plist[@"personData"] = data;

それを元に戻すには、次を使用します。

Person* p = [NSKeyedUnarchiver unarchiveObjectWithData:plist[@"personData"]];
于 2016-01-25T20:20:06.950 に答える