2012-05-24 27 views
11

He intentado hacer una serialización de objetos y Base64 codifica el resultado. Funciona con la lib de Sun:Cómo Base64 codifica un objeto 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())); 

Esto funciona bien. Sin embargo, me gustaría hacer lo mismo usando org.apache.commons.codec.binary.base64, pero esto no devuelve la misma cadena:

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

¿Cuál sería la forma correcta para lograr la correcta ¿Codificación Base64 de un byteArray usando el codificador de Apache?

+0

Qué clase 'Base64' en "lib del sol" está usted usando en tu primer ejemplo? – QuantumMechanic

+0

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

Respuesta

22

En realidad, la versión y la versión commons-codec interna específica Sun está utilizando hacer dan los mismos resultados. Creo que pensó que le estaban dando diferentes versiones, ya que están llamando implícitamente toString() en una serie cuando lo hace:

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

que es definitivamente no imprimir el contenido de la matriz. En cambio, eso solo imprimirá la dirección de la referencia del arreglo.

He escrito el siguiente programa para probar los codificadores uno contra el otro. Vas a ver desde la salida por debajo que el dar los mismos resultados:

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)); 
    } 
} 

y aquí está la salida de una carrera de ella:

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

gracias, tonto, debería haber visto esto :-D –

2

De commons-codec home page:

Codec se formó como un intento de centrar los esfuerzos de desarrollo en un implantación definitiva del codificador Base64. En el momento de la propuesta del Codec , había aproximadamente 34 clases diferentes de Java que trataban con la codificación Base64 distribuida en el repositorio CVS de la Fundación. Los desarrolladores en el proyecto Jakarta Tomcat habían implementado una versión original del códec Base64 que había sido copiado por el Commons HttpClient y el subproyecto XML-RPC del proyecto Apache XML. Después de casi un año, las dos versiones bifurcadas de Base64 tenían significativamente divergentes entre sí. XML-RPC había aplicado numerosas correcciones y parches que no se aplicaron a Commons HttpClient Base64. diferentes subproyectos tenían diferentes implementaciones en varios niveles de cumplimiento de la RFC 2045.

Creo que su problema es el "diferente nivel" de cumplimiento.

Mi consejo: elegir una base 64 codificador/decodificador y se adhieren a ella

+0

Lo haría, estoy contento con sun * excepto * un criterio obsoleto: http://www.techiegyan.com/2009/01/11/warning-sunmiscbase64encoder-is-sun-proprietary-api-and-may-be-removed-in-a-future-release/Es por eso que tengo que cambiar, aunque no quiero a –

+2

Quiere y necesita a menudo divergir, pero siempre gana. –

Cuestiones relacionadas