2010-07-07 15 views
9

Ho bisogno di inviare oggetti attorno a una rete. Userò Twisted e ho appena iniziato a cercare nella documentazione.Qual è il modo migliore per inviare un oggetto su una rete in Python?

Per quanto ne so, l'unico modo in cui Python implementa i socket è attraverso il testo. Quindi, come potrei inviare un oggetto usando le stringhe? Salamoia? O c'è qualcosa di meglio?

+2

Utilizzare i tubi Internet –

+3

In realtà, è meglio usare le valvole. I tubi sono stati sostituiti con tubi nel 1998. – jathanism

+1

Sì. Una serie di loro, infatti. –

risposta

18

La serializzazione più generale in offerta tra Python end-point è il formato di serializzazione (in Python 2.Any, assicurarsi di utilizzare il modulo cPickle, e il protocollo -1 alias pickle.HIGHEST_PROTOCOL, se avete bisogno di interoperabilità tra Python 2.any e Python 3.ogni altra cura è necessaria). Per oggetti particolarmente semplici, il modulo marshal può talvolta essere più veloce e più compatto. Per l'interoperabilità con endpoint non Python, json può essere la soluzione migliore (oppure è possibile utilizzare xml per definire o adottare altri formati di serializzazione esistenti), ma è probabile che siano più ingombranti e lenti da formattare e analizzare.

Per quanto ne so, l'unico modo in cui python implementa socket è tramite testo.

No, tutte le stringhe di byte sono i benvenuti -) Si può essere confuso con il fatto che in Python 2 una "stringa normale" è in realtà una stringa di byte ("testo" sarebbe il tipo unicode!); Python 3 mette le cose a posto e usa Unicode per "stringhe normali" e uno specifico tipo di stringa di byte per stringhe di byte.

Le stringhe di byte sono il modo generale in cui qualsiasi linguaggio eseguirà qualsiasi forma di serializzazione e deserializzazione, secondo alcuni protocolli o altro - tali flussi di byte o blob possono essere inseriti in reti, database, file semplici, ecc. Ecc. , ovviamente.

Twisted offre il proprio formato di serializzazione, come parte twisted.spread - è principalmente per uso con Perspective Broker (PB) ma è possibile riutilizzarlo per i propri scopi se non si desidera utilizzare PB per qualche motivo speciale. La documentazione per la parte serializzazione, twisted.spread.jelly, sono here, e il riassumono bene gli obiettivi del formato ...:

persistenza

S-espressione a base di oggetti Python.

Fa qualcosa di molto simile a Pickle; tuttavia, l'obiettivo principale di pickle sembra essere l'efficienza (sia nello spazio sia nell'ora); Gli obiettivi principali di jelly sono la sicurezza , la leggibilità umana e la portabilità in altri ambienti.

Se ci si preoccupa di più per la sicurezza, la leggibilità e la portabilità, oltre alla velocità e alla compattezza, la gelatina potrebbe davvero servire al meglio.

+0

Questo è fantastico. Grazie per l'aiuto! –

+0

solo 2 centesimi, non ho avuto altro che problemi con pickle (cpickle). Non lo userei come serializzatore di oggetti generici a causa della sua fragilità. Ho trovato il miglior risultato con il marshalling di tipi di dati di base o con uno scopo dao creato per la serializzazione. – ebt

Problemi correlati