Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone应用程序的Xml序列化库_Iphone_Objective C_Xml_Serialization - Fatal编程技术网

iPhone应用程序的Xml序列化库

iPhone应用程序的Xml序列化库,iphone,objective-c,xml,serialization,Iphone,Objective C,Xml,Serialization,Apple为对象序列化/反序列化提供NSArchiver和NSNachriver,但这不能处理任何自定义xml模式。因此,必须手动使用任何自定义xml模式的数据填充对象结构。 由于iPhone开发者社区正在迅速发展,许多新手程序员都对处理可用的xml解析可能性感到绝望 iphonesdk只为xml解析提供NSXmlParser,这对于读取xml文件的某些部分比填充整个对象结构更有用,这确实是一件痛苦的事情 另一种可能是著名的libxml库,它是用ansic编写的——对于那些开始使用objecti

Apple为对象序列化/反序列化提供NSArchiver和NSNachriver,但这不能处理任何自定义xml模式。因此,必须手动使用任何自定义xml模式的数据填充对象结构。 由于iPhone开发者社区正在迅速发展,许多新手程序员都对处理可用的xml解析可能性感到绝望

iphonesdk只为xml解析提供NSXmlParser,这对于读取xml文件的某些部分比填充整个对象结构更有用,这确实是一件痛苦的事情

另一种可能是著名的libxml库,它是用ansic编写的——对于那些开始使用objective-C编程并且以前从未学习过正确的C的人来说,这并不容易使用。事件有很多包装器可用,处理xml对新手来说可能是一件痛苦的事情

在这里,我的想法发生了。一个自动填充对象结构的XmlSerializer库可以使它变得更加简单,并提高许多程序员的应用程序质量。 我的想法应该是这样的:

xml文件

<Test name="Michael" uid="28">
    <Adress street="AlphaBetaGammastrasse 1" city="Zürich" postCode="8000" />

  <Hobbies>
    <Hobby describtion="blabla"/>
    <Hobby describtion="blupblup"/>
  </Hobbies>
</Test>
xml序列化程序应该如何工作

NSError *error = nil;
XMLSerializer *serializer = [[XMLSerializer alloc] init];
NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"TestFile" ofType:@"xml"]];
Test *test = [serializer deserializeWithData:data error:&error];
填充对象结构只需要一行代码:

Test *test = [serializer deserializeWithData:data error:&error];
这将是如此容易使用,任何新手程序员都可以使用它。对于更高级的使用,可以配置序列化程序

你认为这是一个对iPhone和OSX应用程序有用且流行的库吗

编辑:
您可以看到该项目,但它离发布还有一段距离。

这是一个非常好的想法,从实现角度来看,我可以通过将NSXMLArchiver和NSXMLUnarchiver作为NSCoder的子类实现。这样,任何符合NSCoding协议的类都可以轻松地在XML之间进行序列化

序列化为XML时的一个性能问题是将原语值作为属性,因为您不能保证对象请求数据编码的顺序。所以,如果属性是您想要的,那么它在内存缓冲区中将是相当大的。但这将是一个有趣的练习

至于它会有多受欢迎?我想不太受欢迎。用例太小了

  • 设备到设备-简单地使用NSKeyedArchiver更简单、更紧凑
  • 设备到新服务器-新服务器也必须实现相同的方案,序列化为Java、C#或其他任何形式
  • 设备到现有服务器-XML格式已经固定,并且很可能不接近此格式

    • 您所描述的内容隐藏在的内部,并且它支持JSON和XML。通过抛弃所有的连接管理,可以很容易地实现这一点,并将其精简为解析。

      NSKeyedArchiver的工作原理正是因为它不尝试映射到XML模式。很多很多XML模式设计得很糟糕(即,它们将内存中的对象结构转换为外部表示格式)。关键的问题是,文档的设计应该从文档的角度来看是有意义的,然后需要映射到您想要的对象内存布局上。见过引用文档其他部分的具有大量“refid”属性的XML文档吗?这些数据通常是从关系数据库中音译出来的,关系数据库只是在结果集上用尖括号括起来

      因此,从假设XML文档与其代码表示之间的一对一映射开始,除了最简单的情况外,几乎注定要失败。试想一下,如果我们已经在C++中使用了用于在第一个浏览器中实例化文档的对象,那么我们今天将在哪里使用HTML。(嗯,更像是Objective-C,但是嘿…)


      NSKeyedArchiver的要点是,您可以在不破坏加载旧版本能力的情况下改进数据结构。使用某种自动化的实例变量到元素映射(正确地)实现这一点是难以置信的困难。

      我一直在努力解决这个领域的需求,我认为这是一个好主意。为了便于在iPhone上使用,我不得不强迫我的点网络服务返回JSON。一个像样的序列化库会很棒。

      我已经开始了一个类似的开源项目。我把它命名为SAMIXOS。您可以访问此页面并进行尝试。 它处于初步发展阶段。它的工作原理与Enyra的要求类似

      很快我将提供一个示例代码


      Sami

      我打开了一个相关的开源项目:

      • 用Objective-C编写,单个.h。和.m文件
      • 一个@protocol用于名称空间支持,另一个用于不支持名称空间
      例如:

      // allocate serializer
      XMLWriter* xmlWriter = [[XMLWriter alloc]init];
      
      // start writing XML elements
      [xmlWriter writeStartElement:@"Root"];
      [xmlWriter writeCharacters:@"Text content for root element"];
      [xmlWriter writeEndElement];
      
      // get the resulting XML string
      NSString* xml = [xmlWriter toString];
      
      这将生成以下XML字符串:

      <Root>Text content for root element</Root>
      
      根元素的文本内容 根据我的经验,将对象从一个模型(内存中的对象)映射到另一个模型(一些XML模式)的经济高效的工具并不存在,因为逻辑仍然必须以某种方式表示。您最好使用您熟悉的工具(代码!?)来完成工作


      但是如果您坚持使用这样的工具,那么方法就是使您的对象模型与XML模型相同。

      hi sami。我在将您的库添加到我的项目中时遇到问题。您是否有一个这样做的示例项目??OP的示例是一个数据模型,其中包含简单的字段,可以进行序列化。在我看来,问题更多的是如何以苹果的plist格式以外的格式序列化/反序列化XML。很可能,这将用于与不运行OSX的web服务进行数据通信(因此它不是围绕PLIST设计的)。因此,理想情况下,您应该为模式中的每个项目编写一个具有属性的模型对象,并使用它来序列化来自服务的XML结果值。此外,OP的示例是一个“从文档角度”有意义的XML文档。在这种情况下,更有可能是为了支持文档格式而构建的Objective-C对象
      <Root>Text content for root element</Root>