2009-06-03 101 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模型相同。

相關問題