Sergio:
Debe utilizar BLOB. Es bastante directo con JDBC.
El problema con el segundo código que ha publicado es la codificación. También 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.
Todavía debe usar CLOB como tipo de datos porque no sabe cuánto tiempo van a ser los datos serializados.
Aquí hay un ejemplo 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 se puede ver el original answer here
+1 por poner mucho esfuerzo en esta respuesta. –
+1 si realmente NECESITA cadenas, entonces base64 + clob es el camino a seguir. –
+1, Pequeña mejora. Es mejor utilizar la interfaz Serializable en lugar de simple Objeto en el método toString() static private String toString (objeto Serializable) – zinovii