Domanda Libreria di serializzazione Xml per app iPhone [chiusa]


Apple fornisce NSArchiver e NSUnachriver per la serializzazione / deserializzazione degli oggetti, ma questo non può gestire alcun schema xml personalizzato. Quindi compilare una struttura ad oggetti con i dati di qualsiasi schema xml personalizzato deve essere fatto manualmente. Dato che la comunità di sviluppatori di iPhone sta crescendo rapidamente, molti programmatori principianti sono disperati per affrontare le possibilità di analisi degli xml disponibili.

IPhone SDK fornisce solo NSXmlParser per l'analisi xml, che è più utile per leggere alcune parti di un file xml, piuttosto che riempire un'intera struttura di oggetti, il che è davvero un dolore.

L'altra possibilità è la famosa libreria libxml, che è scritta in ANSI C - non è facile da usare per qualcuno che inizia a programmare con C obiettivo ogg-c mai appresa prima. Evento ci sono molti wrapper disponibili, trattare con xml può essere un problema per i principianti.

E qui la mia idea ha luogo. Una libreria XmlSerializer che riempie automaticamente una struttura di oggetti potrebbe renderla molto più semplice e aumentare la qualità delle app per molti programmatori. La mia idea dovrebbe funzionare così:

Il file xml

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

  <Hobbies>
    <Hobby describtion="blabla"/>
    <Hobby describtion="blupblup"/>
  </Hobbies>
</Test>

Le classi da riempire

@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

Come dovrebbe funzionare il serializzatore 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];

Per riempire la struttura dell'oggetto serve solo una riga di codice:

Test *test = [serializer deserializeWithData:data error:&error];

Questo sarebbe così facile da usare che ogni programmatore newbie potrebbe usarlo. Per un uso più avanzato, il serializzatore potrebbe essere configurabile.

Cosa ne pensi, sarebbe una libreria utile e popolare per iPhone e applicazioni OSX?

Modificare: Puoi vedere il progetto Qui, ma è lontano dal rilascio.


11
2018-06-03 12:40


origine


risposte:


NSKeyedArchiver funziona esattamente perché non tenta di eseguire il mapping su uno schema XML. Molti schemi XML sono mal progettati (cioè stanno traducendo una struttura di oggetti in memoria in un formato di rappresentazione esterno). Il problema chiave è che i documenti dovrebbero essere progettati in modo da avere un senso dal punto di vista del documento e che quindi dovrebbero essere mappati su qualsiasi layout di memoria desiderato per i propri oggetti. Documenti XML mai visti con molti attributi 'refid' che si riferiscono ad altre parti del documento? Di solito vengono traslitterati da un database relazionale che sta semplicemente attaccando parentesi angolari sul set di risultati.

Quindi, partendo dal presupposto di una mappatura uno-a-uno tra un documento XML e la sua rappresentazione del codice è praticamente condannata in tutti i casi tranne i più semplici. Pensa a dove saremmo oggi con HTML se fosse stato progettato attorno agli oggetti C ++ che sono stati usati per istanziare il documento nel primo browser ... (beh, più come Objective-C, ma hey ...)

Il punto su NSKeyedArchiver è che puoi evolvere la struttura dei dati senza interrompere la possibilità di caricare versioni precedenti. È incredibilmente difficile farlo (correttamente) usando una sorta di mappatura automatica istanza-var-elemento.


2
2017-09-09 09:17



Ho avviato un progetto open source simile. L'ho chiamato SAMIXOS. puoi visitare questa pagina e provarla. È in sviluppo iniziale. Funziona in modo simile a quello che ha chiesto Enyra.

Presto fornirò un codice di esempio.

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

Sami


1
2017-11-18 19:19



Ho aperto un progetto open source correlato, XML stream writer per iOS:

  • Scritto in Objective-C, un singolo .h. e il file .m
  • Un @protocol per il supporto per lo spazio dei nomi e uno per senza

Esempio:

// 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];

Questo produce la seguente stringa XML:

<Root>Text content for root element</Root>

Nella mia esperienza, non esistono strumenti convenienti per mappare oggetti da un modello (oggetti in memoria) a un altro modello (alcuni Schemi XML), dal momento che la logica deve ancora essere espressa in qualche modo. Stai meglio facendo il lavoro usando strumenti (codice !?) che conosci.

Ma se insisti a utilizzare un tale strumento, la strada da percorrere è quella di rendere il tuo modello di oggetto lo stesso del modello XML.


1
2017-10-08 18:07



Questa è una buona idea, in termini di implementazione lo farei implementando NSXMLArchiver e NSXMLUnarchiver come sottoclassi di NSCoder. In questo modo qualsiasi classe conforme al protocollo NSCoding può essere facilmente serializzata da e verso XML.

Un colpo di prestazioni durante la serializzazione in XML saranno i valori primitivi come attributi, poiché non è possibile garantire l'ordine in cui un oggetto richiederà la codifica dei dati. Quindi se gli attributi sono ciò che si desidera, allora sarà abbastanza grande nei buffer di memoria. Ma sarebbe un esercizio divertente.

Per quanto sarebbe popolare? Non così popolare, penso. Il caso d'uso è troppo piccolo.

  • Da dispositivo a dispositivo: semplicemente usare NSKeyedArchiver è molto più semplice e MOLTO più compatto.
  • Device-to-new server - Il nuovo server dovrebbe implementare lo stesso schema, serializzando su Java, C # o altro.
  • Server Device-to-existing: il formato XML è già stato risolto e molto probabilmente non è vicino a questo.

0
2017-08-28 19:29



Quello che stai descrivendo è sepolto all'interno del ObjectiveResource  implementazionie supporta sia JSON che XML. Dovrebbe essere abbastanza facile puntarlo e ridurlo al solo parsing eliminando tutta la gestione della connessione.


0
2017-09-08 15:46



Ho lottato con i requisiti in questo settore e penso che sarebbe stata una grande idea. Ho dovuto fare il prepotente con i miei servizi dot net per restituire a JSON un facile consumo su un iPhone. Una libreria di serializzazione decente sarebbe superba.


0
2017-09-10 17:08