NSArrayをNSDataに変換する方法は?


82

誰がどのように変換する方法を教えてもらえますNSArrayNSData?私は持っていNSArrayます。に送信する必要がありますNSInputStream。私は変換する必要があることを行うために、NSArrayNSData

私を助けてください、私はここで立ち往生しています。

回答:


190

NSKeyedArchiver(Garrettリンクの投稿の最後の文)を使用します。

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];

のすべてのオブジェクトarrayNSCodingプロトコルに準拠している必要があることに注意してください。これらがカスタムオブジェクトである場合は、オブジェクトのエンコードとデコードについて調べる必要があることを意味します。

これにより、かなり読みにくいプロパティリスト形式が作成されますが、非常に広範囲のオブジェクトを処理できることに注意してください。非常に単純な配列(たとえば文字列)がある場合は、NSPropertyListSerializationを使用すると、少し単純なプロパティリストが作成されます。

NSString *error;
NSData *data = [NSPropertyListSerialization dataFromPropertyList:array format:NSPropertyListBinaryFormat_v1_0 errorDescription:&error];

有線で読み取り可能にしたい場合は、渡すことができるXML形式の定数もあります。


93

やや関連したメモとして、NSDataをNSArrayに戻す方法は次のとおりです。

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data]

5
NSKeyedArchiverではなくNSKeyedUnarchiverであることを確認してください。オートコンプリートを使用する場合、簡単に間違いを犯す可能性があります。
ショーン

2
この回答は、上記から選択した回答と相まって、NSDataとの間で互換性のあるオブジェクトをアーカイブ/アーカイブ解除するのに十分なはずです
Scott D


3

このコードを使用しました。

 NSError *error;
 NSMutableData *jsonData = [[NSJSONSerialization dataWithJSONObject:yourDemoArray
                                                                   options:0 // Pass 0 if you don't care about the readability of the generated string
                                                                     error:&error] copy];

1

あなたはこれを行うことができます-

NSArray *array= [NSArray array];
NSData *dataArray = [NSKeyedArchiver archivedDataWithRootObject:array];

1

iOS 9以降では、これを使用してください。

NSArray *array = [[NSArray alloc] init];
NSData *data = [NSPropertyListSerialization dataWithPropertyList:array format:NSPropertyListBinaryFormat_v1_0 options:0 error:nil];

これの古いバージョンはiOS8で非推奨になりました。


1

スイフト:

let data = NSKeyedArchiver.archivedData(withRootObject: jsonArray)
print(data)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.