Sergio:
Вы должны использовать BLOB. Это довольно сложно с JDBC.
Проблема со вторым кодом, который вы отправили, является кодировкой. Вы должны дополнительно закодировать байты, чтобы убедиться, что ни один из них не сработает.
Если вы все еще хотите записать его в строку, вы можете закодировать байты с помощью java.util.Base64.
Тем не менее вы должны использовать CLOB как тип данных, потому что вы не знаете, сколько будет сериализованных данных.
Вот пример использования.
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;
}
}
Выход:
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
ПРИМЕЧАНИЕ: для Java 7 и более ранних версий вы можете увидеть оригинальную answer here
«ByteArrayOutputStream.toString преобразует с помощью * платформы кодировку по умолчанию *. Вы уверены, что хотите этого? В частности, как произвольный массив байт не является действительным UTF8. Кроме того, база данных собирается его калечить ». – 2008-09-25 17:57:44
Вы должны принять вышеуказанный комментарий от Тома Хотина серьезно – anjanb 2008-09-25 18:12:00