Comment encoder un object Java en Base64 à l’aide de org.apache.commons.codec.binary.base64?

J’ai essayé de faire une sérialisation d’object et Base64 encoder le résultat. Cela fonctionne avec la lib de Sun:

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

Cela fonctionne bien. Cependant, j’aimerais faire la même chose en utilisant org.apache.commons.codec.binary.base64, mais cela ne retourne pas la même chaîne:

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

Quelle serait la bonne façon d’obtenir le codage Base64 correct d’un byteArray à l’aide du codeur Apache?

En fait, la version commons-codec et la version interne spécifique de Sun que vous utilisez donnent les mêmes résultats. Je pense que vous pensiez donner des versions différentes car vous appelez implicitement toSsortingng() sur un tableau lorsque vous le faites:

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

ce qui est définitivement n’imprime pas le contenu du tableau. Au lieu de cela, cela n’imprimera que l’adresse de la référence du tableau.

J’ai écrit le programme suivant pour tester les encodeurs les uns par rapport aux autres. Vous verrez dans la sortie ci-dessous que vous obtenez les mêmes résultats:

 import java.util.Random; public class Base64Stuff { public static void main(Ssortingng[] args) { Random random = new Random(); byte[] randomBytes = new byte[32]; random.nextBytes(randomBytes); Ssortingng internalVersion = com.sun.org.apache.xerces.internal.impl.dv.util.Base64.encode(randomBytes); byte[] apacheBytes = org.apache.commons.codec.binary.Base64.encodeBase64(randomBytes); Ssortingng fromApacheBytes = new Ssortingng(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)); } } 

Et voici le résultat d’une série de projets:

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

Depuis la page d’accueil de commons-codec :

Codec a été créé pour tenter de concentrer les efforts de développement sur une implémentation définitive du codeur Base64. Au moment de la proposition du Codec, environ 34 classes Java différentes traitaient du codage Base64 réparti sur le référentiel CVS de la Fondation. Les développeurs du projet Jakarta Tomcat avaient mis en œuvre une version originale du codec Base64 copiée par le sous-projet XML-RPC du projet Commons HttpClient et du projet Apache XML. Après presque un an, les deux versions à la fourche de Base64 s’étaient considérablement écartées. XML-RPC avait appliqué de nombreux correctifs et correctifs qui ne s’appliquaient pas au Commons HttpClient Base64. Différents sous-projets ont eu différentes implémentations à différents niveaux de conformité à la RFC 2045.

Je pense que votre problème est le “différents niveaux” de conformité.

Mon conseil: choisissez un encodeur / décodeur Base64 et respectez-le