Serializar objeto Java en String ( Base 64 ) - Más allá de lo que ves

miércoles, 14 de noviembre de 2012

Serializar objeto Java en String ( Base 64 )

En referencia al artículo anterior: http://www.montesinos.org.es/2012/11/almacenar-objetos-java-en-base-64-en.html la solución para almacenar directamente el objeto serializado pasaría por añadir una línea con el código siguiente:

private static final long serialVersionUID = -1361890418743713893L;

Donde -1361890418743713893L será la versión de la clase compilada y hará que nuestro código no de excepción, aquellos atributos nuevos que no posea la clase serializada se inicializarán a los valores por defecto.

El código de ejemplo es igual de simple, utiliza Commons Codec versión 1.7 y Commons Lang 2.4
import java.io.IOException;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.SerializationUtils;

public class Main {

 public static void main(String args[]) throws IOException {
  // Instanciar el objeto que vamos a usar.
  ConsultaForm m = new ConsultaForm(1, "javi", "montesinos");
  m.getCursos().add(1);
  m.getCursos().add(222);

  // Pasar Java a un JSON como array de Bytes para codificar en base 64
  byte[] u = SerializationUtils.serialize(m);
  // Codificar json en bytes a una cadena base64
  String s = Base64.encodeBase64String(u);
  // Guardar el objeto en un campo de la base de datos.
  System.out
    .println("Guadar formulario de consulta en la base de datos : "
      + s);

  // Recuperar objeto en base 64 de la base de datos y decodificar a un
  // array de bytes
  String savedSearchValue = "rO0ABXNyAAxDb25zdWx0YUZvcm0AAAAAAAAAAQIABEkAAmlkTAAJYXBlbGx" +
    "pZG9zdAASTGphdmEvbGFuZy9TdHJpbmc7TAAGY3Vyc29zdAAQTGphdmEvdXRpbC9MaXN0O0wABm5vbW" +
    "JyZXEAfgABeHAAAAABdAAKbW9udGVzaW5vc3NyABNqYXZhLnV0aWwuQXJyYXlMaXN0eIHSHZnHYZ0DA" +
    "AFJAARzaXpleHAAAAACdwQAAAAKc3IAEWphdmEubGFuZy5JbnRlZ2VyEuKgpPeBhzgCAAFJAAV2YWx1" +
    "ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cAAAAAFzcQB+AAcAAADeeHQABGphdmk=";
  byte[] dataDos = Base64.decodeBase64(savedSearchValue);

  // Mapear el array de bytes a un objeto SavedSearch
  Object o = SerializationUtils.deserialize(dataDos);
  if (o instanceof ConsultaForm) {
   System.out.println(o.toString());
  } else {
   System.out.println("Noooooooooooooooop !");
  }
 }

}

1 comentario:

  1. Fuente: http://stackoverflow.com/questions/3678136/managing-serveral-versions-of-serialized-java-objects

    ResponderEliminar