2009-06-03 109 views
11

Apple为对象序列化/反序列化提供NSArchiver和NSUnachriver,但这不能处理任何自定义xml模式。因此,使用任何自定义xml架构的数据填充对象结构必须手动完成。 由于iPhone开发者社区正在快速增长,许多新手程序员正在绝望地处理可用的xml解析可能性。适用于iPhone的Xml序列化库应用程序

iPhone SDK只提供NSXmlParser进行XML解析,这比读取XML文件的某些部分更有用,而不是填充整个对象结构,这真的很痛苦。

另一种可能性是着名的libxml库,它是用ANSI C编写的 - 对于开始使用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> 

的类来填补

@interface Test : NSObject { 
    NSString *name; 
    Adress *adress; 
    NSArray *hobbies; 
    int uid; 
} 
@property (nonatomic, copy) NSString *name; 
@property (nonatomic, retain) Adress *adress; 
@property (nonatomic, retain) NSArray *hobbies; 
@property (nonatomic, readwrite) int uid; 
@end 

@interface Adress : NSObject { 
    NSString *street; 
    NSString *city; 
    int postCode; 
} 
@property (nonatomic, copy) NSString *street; 
@property (nonatomic, copy) NSString *city; 
@property (nonatomic, readwrite) int postCode; 
@end 

如何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应用程序有用且受欢迎的库吗?

编辑: 您可以看到项目here,但它是从发布的票价。

+0

下面是类似的东西我敲在一起:http://kpmattius.wordpress.com/2011/06/07/objective-c-serialization/如果有人有时间,他们可以做更多,但它适用于我:D – 2011-06-07 09:28:08

+0

这将有助于... http://code.google.com/p/wonderxml/ – hrishib 2011-03-15 11:37:26

回答

0

这是一个非常好的主意,实施方面我会通过NSXMLArchiver和NSXMLUnarchiver作为NSCoder的子类来实现。这样任何符合NSCoding协议的类都可以很容易地与XML串行化。

序列化为XML时的一个性能将成为原始值作为属性,因为您无法保证对象将请求数据进行编码的顺序。所以如果属性是你想要的,那么它在内存缓冲区中将会非常庞大​​。但这将是一个有趣的练习。

至于它会是多么受欢迎?我觉得不太受欢迎。用例太小。

  • 设备到设备 - 简单地使用NSKeyedArchiver更容易,而且更加紧凑。
  • 设备到新服务器 - 新服务器必须实现相同的方案,并且序列化为Java,C#或其他。
  • 设备到现有服务器 - XML格式已经修复,并且很可能不会接近于此。
0

你所描述的是埋在ObjectiveResourceimplementations之内,它支持JSON和XML。通过抛出所有的连接管理,将其分解为简单的解析应该相当容易。

2

NSKeyedArchiver的工作原理正是因为它没有尝试映射到XML模式。很多很多XML模式的设计都很糟糕(即他们将内存中的对象结构转换为外部表示格式)。关键的问题是文档的设计应该从文档的角度来看是有意义的,然后需要映射到您想要的对象的任何内存布局。曾经见过的XML文档中有很多涉及文档其他部分的'refid'属性?这些通常是从关系数据库中转录而来的,这些数据库只是在结果集中插入角度括号。

因此,首先假定XML文档及其代码表示之间的一对一映射几乎注定了除最简单的情况外。如果它是围绕用于在第一个浏览器中实例化文档的C++对象来设计的,那么请考虑我们今天将使用HTML的位置......(好吧,更像Objective-C,但是嘿......)

有关NSKeyedArchiver的一点是,您可以在不破坏加载旧版本的能力的情况下发展数据结构。使用某种自动化的实例变量到元素映射(恰当地)这样做是难以置信的困难。

+0

OP的例子是一个数据模型,它具有简单的字段,可以序列化。我认为这个问题更多的是关于如何以非苹果plist格式的格式序列化/反序列化XML。很可能,这将用于与不运行OSX的Web服务之间的数据通信(因此它不是围绕plist设计的)。因此,理想情况下,您可以为模式中的每个项目编写一个模型对象,并使用它来序列化服务中的XML结果值。 – George 2012-08-13 18:00:56

0

我一直在努力与这个领域的要求,并认为这将是一个好主意。我不得不欺负我的网络服务以返回JSON,以便在iPhone上轻松使用。一个体面的序列化库会非常棒。

1

我已经开始了一个类似的开源项目。我已将它命名为SAMIXOS。你可以访问这个页面并尝试它。 它在最初的发展。它的工作原理类似于Enyra所要求的。

不久,我会提供一个示例代码。

http://sourceforge.net/projects/samixos/

萨米

1

我已经打开了相关的开放源代码项目,XML stream writer for iOS

  • 用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模型相同。

相关问题