如何将 NSArray 转换为 NSData?

谁能告诉我如何将 NSArray转换成 NSData?我有一个 NSArray。我需要把它发送到 NSInputStream。为了做到这一点,我需要转换的 NSArray到一个 NSData

请帮帮我,我被困在这里了。

82507 次浏览

Use NSKeyedArchiver (which is the last sentence of the post Garrett links):

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];

Note that all the objects in array must conform to the NSCoding protocol. If these are custom objects, then that means you need to read up on Encoding and Decoding Objects.

Note that this will create a fairly hard-to-read property list format, but can handle a very wide range of objects. If you have a very simple array (strings for instance), you may want to use NSPropertyListSerialization, which creates a bit simpler property list:

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

There's also an XML format constant you can pass if you'd rather it be readable on the wire.

On a somewhat related note, here's how you would convert the NSData back to an NSArray:

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data]

You can do this-

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

I used this code.

 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];

In iOS 9+ use this please:

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

The older version of this was deprecated in iOS 8.

Swift :

let data = NSKeyedArchiver.archivedData(withRootObject: jsonArray)
print(data)

Swift 5

let data = try! NSKeyedArchiver.archivedData(withRootObject: array, requiringSecureCoding: true)