2012-05-24 2 views
11

Ho cercato di eseguire una serializzazione degli oggetti e Base64 codifica il risultato. Funziona con la lib di Sun:Come base64 codificare un oggetto Java usando org.apache.commons.codec.binary.base64?

Bean01 bean01 = new Bean01(); 
bean01.setDefaultValues(); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
new ObjectOutputStream(baos).writeObject(bean01); 
System.out.println(Base64.encode(baos.toByteArray())); 

Questo funziona correttamente. Tuttavia, vorrei fare lo stesso utilizzando org.apache.commons.codec.binary.base64, ma questo non restituisce la stessa stringa:

System.out.println(org.apache.commons.codec.binary.Base64.encodeBase64(baos.toByteArray()));

Quale sarebbe il modo corretto per ottenere la corretta Codifica Base64 di un byteArray usando l'encoder di Apache?

+0

Quale classe 'Base64' in "lib del sole" sei usando nel tuo primo esempio? – QuantumMechanic

+0

com.sun.org.apache.xerces.internal.impl.dv.util.Base64 –

risposta

22

in realtà la versione commons-codec e specifica versione interna Sun si utilizza fare danno gli stessi risultati. Credo che si pensava che stavano dando versioni diverse, perché si sta implicitamente chiamando toString() su un array quando si esegue:

System.out.println(org.apache.commons.codec.binary.Base64.encodeBase64(baos.toByteArray())); 

che è sicuramente non stampare il contenuto della matrice. Invece, stamperà solo l'indirizzo del riferimento dell'array.

Ho scritto il seguente programma per testare gli encoder uno contro l'altro. Vedrete dalla uscita inferiore a quella del dare gli stessi risultati:

import java.util.Random; 

public class Base64Stuff 
{ 
    public static void main(String[] args) { 
     Random random = new Random(); 
     byte[] randomBytes = new byte[32]; 
     random.nextBytes(randomBytes); 

     String internalVersion = com.sun.org.apache.xerces.internal.impl.dv.util.Base64.encode(randomBytes); 
     byte[] apacheBytes = org.apache.commons.codec.binary.Base64.encodeBase64(randomBytes); 
     String fromApacheBytes = new String(apacheBytes); 

     System.out.println("Internal length = " + internalVersion.length()); 
     System.out.println("Apache bytes len= " + fromApacheBytes.length()); 
     System.out.println("Internal version = |" + internalVersion + "|"); 
     System.out.println("Apache bytes  = |" + fromApacheBytes + "|"); 
     System.out.println("internal equal apache bytes?: " + internalVersion.equals(fromApacheBytes)); 
    } 
} 

Ed ecco l'output di una corsa di esso:

Internal length = 44 
Apache bytes len= 44 
Internal version = |Kf0JBpbxCfXutxjveYs8CXMsFpQYgkllcHHzJJsz9+g=| 
Apache bytes  = |Kf0JBpbxCfXutxjveYs8CXMsFpQYgkllcHHzJJsz9+g=| 
internal equal apache bytes?: true 
+0

grazie - stupiscimi, avrei dovuto vedere questo :-D –

2

Da commons-codec home page:

Codec stato formato come un tentativo di concentrarsi sforzo di sviluppo su un definitiva attuazione del codificatore Base64. Al momento della proposta di Codec , c'erano circa 34 classi Java diverse che si occupavano della codifica Base64 distribuita sul repository CVS della Fondazione. Gli sviluppatori del progetto Jakarta Tomcat avevano implementato una versione originale del codec Base64 che era stata copiata dal sottoprogetto XML-RPC del progetto Commons HttpClient e Apache XML Commons. Dopo lo quasi un anno, le due versioni a forcella di Base64 avevano significativamente divergenti l'una dall'altra. XML-RPC ha applicato numerose correzioni e patch che non sono state applicate a Commons HttpClient Base64. diversi sottoprogetti erano diverse implementazioni a vari livelli di conformità con la RFC 2045.

Credo che il problema è il "livello di vari" di conformità.

Il mio consiglio: scegliere un encoder base64/decoder e bastone ad esso

+0

Vorrei, sono felice con il sole * tranne * un criterio di non-go: http://www.techiegyan.com/2009/01/11/warning-sunmiscbase64encoder-is-sun-proprietary-api-e-may-be-removed-in-a-future-release/Ecco perché devo passare, anche se non voglio a –

+2

Desideri e bisogno spesso divergono, ma devono sempre vincere. –