Domanda

Ho un'applicazione web sviluppata in Adobe Flex 3 e Python 2.5 (distribuito su Google App Engine). Un servizio web RESTful è stato creato in Python ed i suoi risultati sono attualmente in un formato XML che viene letto dal Flex utilizzando l'oggetto HTTPService.

Ora l'obiettivo principale è quello di comprimere l'XML in modo che ci sia meno come un tempo compreso tra il metodo e di risultato HTTPService send () eventi. Alzai gli occhi docs Python e sono riuscito a utilizzare zlib.compress () per comprimere il risultato XML.

Poi ho impostato il tipo di risultato HTTPService da "xml" a "text" e provato ad utilizzare bytearrays per decomprimere la stringa di nuovo a XML. Qui è dove ho fallito. Sto facendo qualcosa di simile:

var byteArray:ByteArray = new ByteArray();
byteArray.writeUTF( event.result.toString() );
byteArray.uncompress();
var xmlResult:XML = byteArray.readUTF();

La sua un'eccezione a ByteArray.uncompress () e dice in grado di decomprimere il ByteArray. Anche quando traccio la lunghezza del ByteArray ottiene 0.

Impossibile capire cosa sto facendo male. Tutto l'aiuto è apprezzato.

- Modifica -

Il codice:

# compressing the xml result in Python
print zlib.compress(xmlResult)

# decompresisng it in AS3
var byteArray:ByteArray = new ByteArray();
byteArray.writeUTF( event.result.toString() );
byteArray.uncompress()

Evento è di tipo ResultEvent.

L'errore:

Errore: Errore # 2058:. Si è verificato un errore di decompressione dei dati

L'errore potrebbe essere perché il valore ByteArray.bytesAvailable = 0 significa che il byte grezzo pitone generato non è stato scritto in ByteArray correttamente ..

- Sri

È stato utile?

Soluzione

Che cosa è byteArray.writeUTF( event.result.toString() ); dovrebbe fare? Il risultato di zlib.compress () è né unicode né "UTF" (senso senza un numero dopo esso !?); è binario byte alias prime; si dovrebbe né decodificarlo né codificare né applicare qualsiasi altra trasformazione ad essa. Il ricevitore deve decomprimere immediatamente i byte grezzi che riceve, al fine di recuperare i dati che sono stati passati a zlib.compress ().

Aggiorna Quale documentazione avete per sostenere l'idea che byteArray.uncompress() si aspetta un vero e proprio zlib flusso e non un deflate flusso (vale a dire un flusso zlib dopo aver tagliò i primi 2 byte e l'ultimo 4)?

La documentazione Flex 3 di ByteArray dà questo esempio:

bytes.uncompress(CompressionAlgorithm.DEFLATE);

, ma inutilmente non dice ciò che il default (se presente) è. Se c'è un difetto, non è documentato da nessuna parte evidente, quindi sarebbe una buona idea per l'uso

bytes.uncompress(CompressionAlgorithm.ZLIB);

per rendere evidente ciò che si intende.

E i documenti parlano di un metodo writeUTFBytes, non è un metodo writeUTF. Sei sicuro che si copia / incollato il codice esatto del ricevitore nella tua domanda?

Aggiorna 2

Grazie per l'URL. Sembra che ho avuto in mano l ' "aiuto", non è il vero documentazione: = (Un paio di punti:.

(1) sì, c'è un metodo inflate() esplicito. Tuttavia decomprimere ha un algoritmo di arg; Può essere sia CompressionAlgorithm.ZLIB (impostazione predefinita) o CompressionAlgorithm.DEFLATE ... è interessante notare che quest'ultimo è però disponibile solo in Adobe Air, non in Flash Player. Almeno sappiamo che la chiamata uncompress () appare OK, e siamo in grado di tornare al problema di ottenere i byte non elaborati sul filo e via di nuovo in un'istanza ByteArray.

(2) Ancora più importante, ci sono sia writeUTF (Scrive una stringa UTF-8 nel flusso di byte. La lunghezza della stringa UTF-8 in byte viene scritto prima come 16- bit integer, seguiti dai byte che rappresentano i caratteri della stringa) e writeUTFBytes (scrive una stringa UTF-8 nel flusso di byte. simile al writeUTF () metodo, ma writeUTFBytes () non fa prefisso la stringa con una lunghezza di parola di 16 bit).

Qualunque sia i meriti di fornitura di byte UTF8-encoded (nil, IMHO), non si desidera un prefisso di lunghezza di 2 byte lì; usando writeUTF () è garantito per causare uncompress () per Bork .

Come mai ad filo:. Utilizzando Python stampa su dati binari non sembra una buona idea (a meno che non sia stato sys.stdout nobbled per l'esecuzione in modalità raw, che non avete mostrare nel codice)

sembra piuttosto improbabile che lavorare con quello e poi la codifica in UTF-8

-

Allo stesso modo facendo event.result.toString () ottenendo una stringa (simile ad un oggetto Python unicode, sì / no?).

Dato che non sapevo che esistesse flessione fino ad oggi, davvero non posso aiutare in modo efficace. Ecco alcuni ulteriori suggerimenti verso l'autosufficienza nel caso in cui nessuno che sa più flessibile arriva presto:

(1) Fare qualche debug. Inizia con un documento XML minimo. Mostra repr(xml_doc). Mostra repr(zlib_compress_output). In (una versione ridotta del) lo script flex, utilizzare la funzione / metodo più vicino alla repr() che si può trovare a mostrare: event.result, event.result.toString() e il risultato di writeUTF*(). Assicuratevi di capire gli effetti di tutto ciò che può accadere dopo zlib.compress (). Leggendo con attenzione la documentazione può aiutare.

(2) Guarda come è possibile ottenere byte grezzi fuori event.result.

HTH, John

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top