我可以将NSData对象保存为二进制文件吗?

时间:2015-07-14 21:33:50

标签: swift archive nskeyedarchiver

我正在尝试将数据保存为二进制格式的文件,因此文件大小尽可能小。但似乎NSPropertyListFormat.BinaryFormat_v1_0实际上并不创建二进制数据,而是创建与NSPropertyListFormat.XMLFormat_v1_0完全相同的XML样式格式。难道我做错了什么?这是一些测试代码:

<div class="container">
  <div class="de">
    <div class="den">
      <div class="dene">
        <div class="denem">
          <div class="deneme" id="deneme">
            <span></span><strong>&deg</strong>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

</center>

当我检查这个创建的文件时,我发现它是一个XML文件。如果我将.BinaryFormat_v1_0更改为.XMLFormat_v1_0,它与字节数完全相同。

那么如何将数据保存为二进制文件?

编辑:这是文件内容:

@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")
}

1 个答案:

答案 0 :(得分:1)

TextWrangler可能知道如何读取plist文件,无论是二进制还是XML格式。要真正看到差异,您必须使用与plist文件类型无关的实用程序。以下所有信息均使用您发布的示例代码。

文件大小:

> ls -l FileName*
-rw-r--r--  1 zd  staff  196 14 Jul 19:10 FileNameBinary
-rw-r--r--  1 zd  staff  700 14 Jul 19:10 FileNameXML

因此二进制格式比XML小得多(196对700字节)。

文件内容:

> cat FileNameBinary
bplist00?

X$versionX$objectsY$archiverT$top???    U$nullVRobertUSmith_NSKeyedArchiver?
VdoubleUfirstRpiTlast#@^?/??w?"@I#-27;AHN`ipvy~????

> cat FileNameXML
<?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">
(extra lines trimmed)

内容再次不同。

两种格式之间存在差异。你只需要知道如何寻找它们。