Sergio:
Deberías usar BLOB . Es bastante sencillo con JDBC.
El problema con el segundo código que publicaste es la codificación. Además, debe codificar los bytes para asegurarse de que ninguno de ellos falle.
Si aún desea escribirlo en una Cadena, puede codificar los bytes usando java.util.Base64 .
Aún así, debe usar CLOB como tipo de datos porque no sabe cuánto tiempo durarán los datos serializados.
Aquí hay una muestra de cómo usarlo.
import java.util.*;
import java.io.*;
/**
* Usage sample serializing SomeClass instance
*/
public class ToStringSample {
public static void main( String [] args ) throws IOException,
ClassNotFoundException {
String string = toString( new SomeClass() );
System.out.println(" Encoded serialized version " );
System.out.println( string );
SomeClass some = ( SomeClass ) fromString( string );
System.out.println( "\n\nReconstituted object");
System.out.println( some );
}
/** Read the object from Base64 string. */
private static Object fromString( String s ) throws IOException ,
ClassNotFoundException {
byte [] data = Base64.getDecoder().decode( s );
ObjectInputStream ois = new ObjectInputStream(
new ByteArrayInputStream( data ) );
Object o = ois.readObject();
ois.close();
return o;
}
/** Write the object to a Base64 string. */
private static String toString( Serializable o ) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream( baos );
oos.writeObject( o );
oos.close();
return Base64.getEncoder().encodeToString(baos.toByteArray());
}
}
/** Test subject. A very simple class. */
class SomeClass implements Serializable {
private final static long serialVersionUID = 1; // See Nick's comment below
int i = Integer.MAX_VALUE;
String s = "ABCDEFGHIJKLMNOP";
Double d = new Double( -1.0 );
public String toString(){
return "SomeClass instance says: Don't worry, "
+ "I'm healthy. Look, my data is i = " + i
+ ", s = " + s + ", d = " + d;
}
}
Salida:
C:\samples>javac *.java
C:\samples>java ToStringSample
Encoded serialized version
rO0ABXNyAAlTb21lQ2xhc3MAAAAAAAAAAQIAA0kAAWlMAAFkdAASTGphdmEvbGFuZy9Eb3VibGU7T
AABc3QAEkxqYXZhL2xhbmcvU3RyaW5nO3hwf////3NyABBqYXZhLmxhbmcuRG91YmxlgLPCSilr+w
QCAAFEAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cL/wAAAAAAAAdAAQQUJ
DREVGR0hJSktMTU5PUA==
Reconstituted object
SomeClass instance says: Don't worry, I'm healthy. Look, my data is i = 2147483647, s = ABCDEFGHIJKLMNOP, d = -1.0
NOTA : para Java 7 y versiones anteriores, puede ver la respuesta original aquí
serialVersionUID
aSomeClass
protegerá contra nuevos campos que se agregarán, pero si se eliminan los campos, se perderá. Vale la pena leer lo que Joshua Bloch tiene que decir sobre esto en Java efectivo - books.google.co.uk/…¿Qué tal escribir los datos en un ByteArrayOutputStream en lugar de un FileOutputStream?
De lo contrario, puede serializar el objeto utilizando XMLEncoder, conservar el XML y luego deserializarlo mediante XMLDecoder.
fuente
Gracias por sus excelentes y rápidas respuestas. Daré algunos votos inmediatamente para agradecer su ayuda. En mi opinión, he codificado la mejor solución basada en sus respuestas.
Tenga en cuenta que no consideré usar JSON porque es menos eficiente.
Nota: consideraré su consejo sobre no almacenar objetos serializados como cadenas en la base de datos, sino el byte [].
fuente
Enfoque Java8, que convierte Objeto de / a Cadena, inspirado en la respuesta de OscarRyz . Para la descodificación / codificación, se requiere y utiliza java.util.Base64 .
fuente
XStream proporciona una sencilla utilidad para serializar / deserializar a / desde XML, y es muy rápido. Almacenar CLOB XML en lugar de BLOBS binarios será menos frágil, por no mencionar más legible.
fuente
¿Qué tal persistir el objeto como una gota
fuente
Si está almacenando un objeto como datos binarios en la base de datos, entonces realmente debería usar un
BLOB
tipo de datos. La base de datos puede almacenarla de manera más eficiente, y no tiene que preocuparse por las codificaciones y similares. JDBC proporciona métodos para crear y recuperar blobs en términos de flujos. Utilice Java 6 si puede, hizo algunas adiciones a la API JDBC que hacen que manejar blobs sea mucho más fácil.Si realmente necesita almacenar los datos como una Cadena, recomendaría XStream para el almacenamiento basado en XML (mucho más fácil que
XMLEncoder
), pero las representaciones de objetos alternativas podrían ser igual de útiles (por ejemplo, JSON). Su enfoque depende de por qué realmente necesita almacenar el objeto de esta manera.fuente
Eche un vistazo a la clase java.sql.PreparedStatement, específicamente la función
http://java.sun.com/javase/6/docs/api/java/sql/PreparedStatement.html#setBinaryStream(int,%20java.io.InputStream)
Luego eche un vistazo a la clase java.sql.ResultSet, específicamente la función
http://java.sun.com/javase/6/docs/api/java/sql/ResultSet.html#getBinaryStream(int)
Tenga en cuenta que si está serializando un objeto en una base de datos, y luego cambia el objeto en su código en una nueva versión, el proceso de deserialización puede fallar fácilmente porque la firma de su objeto cambió. Una vez cometí este error al almacenar una Preferencia personalizada serializada y luego hacer un cambio en la definición de Preferencias. De repente no pude leer ninguna de las informaciones serializadas previamente.
Puede que sea mejor escribir columnas torpes por propiedad en una tabla y componer y descomponer el objeto de esta manera, para evitar este problema con las versiones de objetos y la deserialización. O escribir las propiedades en un hashmap de algún tipo, como un objeto java.util.Properties, y luego serializar el objeto de propiedades que es extremadamente improbable que cambie.
fuente
La secuencia serializada es solo una secuencia de bytes (octetos). Entonces, la pregunta es cómo convertir una secuencia de bytes en una Cadena y viceversa. Además, necesita usar un conjunto limitado de códigos de caracteres si va a almacenarse en una base de datos.
La solución obvia al problema es cambiar el campo a un LOB binario. Si desea seguir con un LOB de caracter, entonces necesitará codificar en algún esquema como base64, hexadecimal o uu.
fuente
Puede usar la compilación en las clases sun.misc.Base64Decoder y sun.misc.Base64Encoder para convertir los datos binarios de la serialización en una cadena. No necesita clases adicionales porque están integradas.
fuente
puedes usar UUEncoding
fuente
Solución simple, funcionó para mí
fuente
Use un marco O / R como hibernar
fuente