【发布时间】:2015-10-03 18:00:13
【问题描述】:
我正在尝试将数据以二进制格式保存到文件中,以便文件大小尽可能小。但似乎 NSPropertyListFormat.BinaryFormat_v1_0 实际上并没有创建二进制数据,而是创建了与 NSPropertyListFormat.XMLFormat_v1_0 完全相同的 XML 样式格式。难道我做错了什么?下面是一些测试代码:
@IBAction func archiveAction(sender: AnyObject) {
let firstName = "Robert"
let lastName = "Smith"
var md: NSMutableData = NSMutableData()
var archiver = NSKeyedArchiver(forWritingWithMutableData:md)
archiver.outputFormat = NSPropertyListFormat.BinaryFormat_v1_0
archiver.encodeObject(firstName, forKey: "first")
archiver.encodeDouble(123.456, forKey: "double")
archiver.encodeFloat(Float(M_PI), forKey: "pi")
archiver.encodeObject(lastName, forKey: "last")
archiver.finishEncoding()
let filePath = NSTemporaryDirectory().stringByAppendingPathComponent("FileNameBinary")
md.writeToFile(filePath, atomically: false)
println("done")
}
当我检查这个创建的文件时,我发现它是一个 XML 文件。如果我将 .BinaryFormat_v1_0 更改为 .XMLFormat_v1_0,它的字节数完全相同。
那么如何将数据保存为二进制呢?
编辑:这是文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>$archiver</key>
<string>NSKeyedArchiver</string>
<key>$objects</key>
<array>
<string>$null</string>
<string>Robert</string>
<string>Smith</string>
</array>
<key>$top</key>
<dict>
<key>double</key>
<real>123.456</real>
<key>first</key>
<dict>
<key>CF$UID</key>
<integer>1</integer>
</dict>
<key>last</key>
<dict>
<key>CF$UID</key>
<integer>2</integer>
</dict>
<key>pi</key>
<real>3.1415927410125732</real>
</dict>
<key>$version</key>
<integer>100000</integer>
</dict>
</plist>
【问题讨论】:
-
BinaryFormat_v1_0 不是 XML。你如何检查文件?
-
我使用独立的 Mac 实用程序“iExplorer”检查文件,它可以访问 iPhone 上的文件系统。所以我用它把文件复制到Mac桌面,然后用TextWrangler打开它。我将编辑原始问题以显示在 TextWrangler 中出现的文件。我通过在运行前从手机中删除应用程序,仔细验证了它不是之前运行遗留下来的文件。
-
您之前拥有的是存档。
$archiver NSKeyedArchiver $objects $null Robert Smith $top double 123.456 first CF$UID 1 last CF$UID 2 pi 3.1415927410125732 $version 100000有什么问题? -
嗯。显然这里有一些我不明白的地方。 iExplorer 说 iPhone 上的文件是 196 字节,但是当我在 TextWrangler 中查看它时(现在在帖子中显示)它是 700 字节,所以你可能是对的。在我不知情的情况下,文件必须在某处转换为它的 XML 表示形式。我得再考虑一下。谢谢。
-
我现在看到 TextWrangler 将文件显示为 XML。我想这是一个特点。如果我用 TextEdit.app 查看同一个文件,它看起来应该是一个二进制文件。此外,它是二进制的正确大小(大约是 XML 大小的 0.3 倍)。
标签: swift archive nskeyedarchiver