是否可以将NSData(从NSKeyedArchiver获得)保存为NSString,然后读回NSData?



我想将一些信息保存到视频元数据中。现在我可以保存文本,即String对象。

// this works well
let metaItem = AVMutableMetadataItem()
metaItem.key = AVMetadataCommonKeySource as NSCopying & NSObjectProtocol
metaItem.keySpace = AVMetadataKeySpaceCommon
metaItem.value = String("some text") as! NSCopying & NSObjectProtocol

因此,我只想序列化自定义对象,而不仅仅是String

class ARTRMetadata: NSObject, NSCoding {
// ... 
required init(coder aDecoder: NSCoder) {
//...
}
func encode(with aCoder: NSCoder) {
//...
}
}

我试图将Data转换为String,它崩溃了,现在我卡在将Data写入/读取到.txt文件中:

static func saveMetadataObjectAsText(memento: ARTRMetadata)->String {
let tempFilepath = NSTemporaryDirectory().appending("someFile2.txt")
FileManager.default.createFile(atPath: tempFilepath, contents: nil, attributes: nil)
if NSKeyedArchiver.archiveRootObject(memento, toFile: tempFilepath) {}
else { print("archiveRootObject toFile: FAILURE") }
do {
let contentsFeedToMetadataItem = try String(contentsOfFile: tempFilepath)
//let contentsFeedToMetadataItem = try String(contentsOfFile: tempFilepath, encoding: String.Encoding.utf8) // The file “someFile2.txt” couldn’t be opened using text encoding Unicode (UTF-8).
return contentsFeedToMetadataItem
}
catch { print(error) }
return "ERROR in contentsFeedToMetadataItem"
}

现在它崩溃了,因为"无法打开文件"someFile2.txt,因为无法确定其内容的文本编码。

我想问题是从NSKeyedArchiver获得的NSDataNSString无效.如果我是对的,如何将数据转储为文本?然后使用相同的字节恢复它(NSKeyedUnarchiver(?

提前感谢!

为什么要将数据另存为文本文件?即使你可以Data保存为字符串(如果你用base64编码,你确实可以(,无论如何它都不是人类可读的——嗯,可能只有极少数人能流利地阅读base64。

长话短说,Data直接保存到磁盘并读回。Data提供了适当的 API。

顺便说一句:无论如何,archiveRootObject(toFileData,所以阅读try Data(contentsOfFile: tempFilepath)并返回。

最新更新