Sergio:
Anda harus menggunakan BLOB . Ini cukup lurus ke depan dengan JDBC.
Masalah dengan kode kedua yang Anda posting adalah pengkodean. Anda juga harus mengkodekan byte untuk memastikan tidak ada yang gagal.
Jika Anda masih ingin menuliskannya ke dalam String, Anda dapat menyandikan byte menggunakan java.util.Base64 .
Tetap Anda harus menggunakan CLOB sebagai tipe data karena Anda tidak tahu berapa lama data serial akan terjadi.
Berikut adalah contoh cara menggunakannya.
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;
}
}
Keluaran:
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
CATATAN : untuk Java 7 dan sebelumnya Anda dapat melihat jawaban aslinya di sini
serialVersionUID
keSomeClass
akan melindungi terhadap bidang baru yang ditambahkan tetapi jika bidang dihapus Anda akan kacau. Layak untuk membaca apa yang dikatakan Joshua Bloch tentang ini di Java Efektif - books.google.co.id/...Bagaimana dengan menulis data ke ByteArrayOutputStream alih-alih FileOutputStream?
Jika tidak, Anda bisa membuat serial objek menggunakan XMLEncoder, tahan XML, lalu deserialize melalui XMLDecoder.
sumber
Terima kasih atas balasan yang bagus dan cepat. Saya akan memberikan beberapa suara secara langsung untuk mengakui bantuan Anda. Saya telah memberi kode solusi terbaik menurut pendapat saya berdasarkan jawaban Anda.
Catatan saya tidak mempertimbangkan menggunakan JSON karena kurang efisien.
Catatan: Saya akan mempertimbangkan saran Anda tentang tidak menyimpan objek berseri sebagai string dalam database tetapi sebagai byte [].
sumber
Pendekatan Java8, mengubah Object dari / ke String, terinspirasi oleh jawaban dari OscarRyz . Untuk de- / encoding, java.util.Base64 diperlukan dan digunakan.
sumber
XStream menyediakan utilitas sederhana untuk membuat serial / deserializing ke / dari XML, dan ini sangat cepat. Menyimpan XML CLOBs daripada BLOBS biner akan menjadi kurang rapuh, belum lagi lebih mudah dibaca.
sumber
Bagaimana dengan bertahan objek sebagai gumpalan
sumber
Jika Anda menyimpan objek sebagai data biner dalam database, maka Anda harus menggunakan
BLOB
tipe data. Basis data dapat menyimpannya dengan lebih efisien, dan Anda tidak perlu khawatir tentang penyandian dan sejenisnya. JDBC menyediakan metode untuk membuat dan mengambil gumpalan dalam hal aliran. Gunakan Java 6 jika Anda bisa, itu membuat beberapa penambahan ke JDBC API yang membuat berurusan dengan gumpalan jauh lebih mudah.Jika Anda benar-benar perlu menyimpan data sebagai String, saya akan merekomendasikan XStream untuk penyimpanan berbasis XML (jauh lebih mudah daripada
XMLEncoder
), tetapi representasi objek alternatif mungkin sama berguna (misalnya JSON). Pendekatan Anda tergantung pada mengapa Anda benar-benar perlu menyimpan objek dengan cara ini.sumber
Lihatlah kelas java.sql.PreparedStatement, khususnya fungsinya
http://java.sun.com/javase/6/docs/api/java/sql/PreparedStatement.html#setBinaryStream(int,%20java.io.InputStream)
Kemudian lihatlah kelas java.sql.ResultSet, khususnya fungsinya
http://java.sun.com/javase/6/docs/api/java/sql/ResultSet.html#getBinaryStream(int)
Ingatlah bahwa jika Anda membuat serial objek ke dalam database, dan kemudian Anda mengubah objek dalam kode Anda dalam versi baru, proses deserialisasi dapat dengan mudah gagal karena tanda tangan objek Anda berubah. Saya pernah melakukan kesalahan ini dengan menyimpan Preferensi kustom bersambung dan kemudian membuat perubahan ke definisi Preferensi. Tiba-tiba saya tidak bisa membaca informasi serial sebelumnya.
Anda mungkin lebih baik menulis kikuk per kolom properti dalam tabel dan menulis dan mendekomposisi objek dengan cara ini, untuk menghindari masalah ini dengan versi objek dan deserialization. Atau menulis properti ke dalam semacam peta, seperti objek java.util.Properties, dan kemudian membuat serial objek properti yang sangat tidak mungkin berubah.
sumber
Aliran berseri hanyalah urutan byte (oktet). Jadi pertanyaannya adalah bagaimana mengubah urutan byte ke String, dan kembali lagi. Lebih lanjut ia perlu menggunakan seperangkat kode karakter terbatas jika akan disimpan dalam database.
Solusi yang jelas untuk masalah ini adalah mengubah bidang ke LOB biner. Jika Anda ingin tetap menggunakan LOB characer, maka Anda harus menyandikan dalam beberapa skema seperti base64, hex atau uu.
sumber
Anda dapat menggunakan build di kelas sun.misc.Base64Decoder dan sun.misc.Base64Encoder untuk mengonversi data biner dari serialisasi menjadi string. Anda tidak perlu kelas tambahan karena ini dibangun.
sumber
Anda dapat menggunakan UUEncoding
sumber
Solusi Sederhana, berhasil untuk saya
sumber
Gunakan kerangka kerja O / R seperti hibernate
sumber