【问题标题】:Sample (preferably simple) subclass of NSCoder?NSCoder 的示例(最好是简单的)子类?
【发布时间】:2010-02-27 22:59:15
【问题描述】:

我正在尝试创建 NSCoder 的子类,但我真的不知道从哪里开始。 Apple's documentation 列出了需要哪些方法,但仅此而已。也许我的 Google-fu 很弱,但我找不到任何实现示例,例如encodeValueOfObjCType:at:,任何地方。 (虽然我认为它涉及很多案例。)

有人知道我可以查看的 NSCoder 示例子类,或者知道encodeValueOfObjCType:at:decodeValueOfObjCType:at: 的一两个案例应该是什么样子的吗?

【问题讨论】:

  • 除了继承 NSCoder 之外,你还想实现什么?您不必继承 NSCoder 来归档对象。
  • 我正在尝试创建自己的归档器,它可以处理更简单的对象图,但会生成人类可读的 XML。

标签: objective-c subclassing nscoder


【解决方案1】:

我刚刚开源了一个NSCoder 子类here 它基本上是已弃用的NSArchiver 的复制品。 应该让任何偶然发现这个问题的人开始。

【讨论】:

    【解决方案2】:

    我也一直想(ab)使用 NSCoder 来生成比 NSKeyedArchiver 生成的更简单的 XML,并为它实现了一些类。这些类被称为RWPlainXMLTreeEncoderRWPlainXMLTreeDecoder,我也写了some test code for them

    RWPlainXMLTreeEncoder 假设您正在编码的对象图是一棵树(如果同一个对象被编码两次,解码后的树将包含两个不同的副本而不是一个共享副本;如果您尝试编码循环图,它会引发一个例外)。每个编码对象都会生成一个 XML 元素,该元素看起来与本示例中的元素大致相似,即包含字符串“A string”的数组的编码:

    <ROOT type="@NSArray"><NS.object.0 type="@NSString"><NS.bytes>4120737472696E67</NS.bytes></NS.object.0></ROOT>
    

    我想通过对数组和字符串等对象使用不同的方法而不是对象自己的encodeWithCoder:来进一步改进上面的内容,这样上面就变成了:

    <ROOT type="array"><item.0 type="string">A string</item.0></array></ROOT>
    

    但我不确定我是否会继续研究这个问题。我的总体目标是有一个相当通用、简单的方法将对象树保存到文件中,该文件利用了我已经编写的encodeWithCoder: 方法,同时生成的文件不像使用 NSKeyedArchiver 时那样依赖 Cocoa。这将允许其他人编写在其他平台上打开这些文件的应用程序。

    但我现在明白了 similar efforts 可能已经更高级了,此外,由于 XML 是一种文档标记语言,它可能不是最好的目标格式,而一些 non-markup language 可能是更适合。

    尽管如此,如果您想继续这个或有其他理由查看一个相当简单的 NSCoder 子类,请随意使用我的代码。你也可以看看MAKeyedArchiver。哦,我的代码包含在 BSD 风格的许可证中(至少 SVN revision 424 中的版本是,我可能会在以后的版本中更改它)。欢迎改进和反馈。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2018-10-13
    • 2014-04-18
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多