2010-09-17 16 views
44

Ho bisogno di convertire oggetti in un byte [] per essere memorizzati nell'archivio valori-chiave di Tokyo Cabinet. Devo anche annullare il byte [] a un oggetto durante la lettura dall'archivio valori-chiave.Java: oggetto a byte [] e byte [] a convertitore di oggetti (per cabinet Tokyo)

Ci sono pacchetti che possono aiutarmi in questo compito? O sarebbe la soluzione migliore per implementarlo da solo?

+2

Crea la tua classe [Serializable] (http://download.oracle.com/javase/6/docs/api/java/io/Serializable.html), quindi utilizza la risposta a [ Java Serializable Object to Byte Array ] (http://stackoverflow.com/questions/2836646/java-serializable-object-to-byte-array). –

+0

non è un duplicato esatto, anche se sembra così – Bozho

risposta

119
public static byte[] serialize(Object obj) throws IOException { 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    ObjectOutputStream os = new ObjectOutputStream(out); 
    os.writeObject(obj); 
    return out.toByteArray(); 
} 
public static Object deserialize(byte[] data) throws IOException, ClassNotFoundException { 
    ByteArrayInputStream in = new ByteArrayInputStream(data); 
    ObjectInputStream is = new ObjectInputStream(in); 
    return is.readObject(); 
} 
+0

non dimenticare di chiamare 'is.close' e' in.close'. –

+16

'is.close' e' in.close' non sono necessari in questo caso perché è un flusso in memoria. L'unica cosa che farebbe qui è renderla più lenta e più prolissa. Ma capisco che l'IDE potrebbe contrassegnare il codice sopra perché il flusso non è chiuso. –

+3

Non credo che rallenterà, è solo un metodo vuoto, quindi la differenza di orario deve essere molto bassa. Ma hai ragione: 'La chiusura di un ByteArrayOutputStream non ha alcun effetto. [Java Doc] (http://docs.oracle.com/javase/6/docs/api/java/io/ByteArrayOutputStream.html#close%28%29) Fantastico: D –

9

Se la classe estende Serializable, è possibile scrivere e leggere oggetti tramite un ByteArrayOutputStream, questo è quello che faccio di solito.

+3

Tutti i tipi inclusi come variabili nella classe (e tutti i tipi in quei tipi e così via) devono essere anche serializzabili. –

+0

In realtà ha bisogno di un ObjectOutputStream per avvolgere anche il BAOS ... Ma sì, questa è la via più facile da percorrere. –

+0

Prendere in considerazione l'utilizzo di qualcosa di diverso dalla serializzazione integrata di Java: serializzazione JBoss, JSerial, Avro, ecc. O un formato XML come XStream o Javolution marshalling più gzip. La serializzazione standard non è particolarmente veloce e, sebbene la sua efficienza dello spazio marginale sia buona, c'è un bel po 'di overhead per-stream. –

5

Puoi vedere come Hector fa questo per Cassandra, dove l'obiettivo è lo stesso: convertire tutto in e da byte[] per archiviare/recuperare da un database NoSQL - see here. Per i tipi primitivi (+ String), esistono Serializzatori speciali, altrimenti esiste il ObjectSerializer generico (che si aspetta Serializable e utilizza ObjectOutputStream). Ovviamente puoi usarlo solo per tutto, ma potrebbero esserci metadati ridondanti nella forma serializzata.

Immagino che tu possa copiare l'intero pacchetto e farne uso.