Katakanlah saya memiliki kelas serializable AppMessage
.
Saya ingin mengirimkannya sebagai byte[]
soket ke mesin lain di mana ia dibangun kembali dari byte yang diterima.
Bagaimana saya bisa mencapai ini?
java
object
serialization
iTEgg
sumber
sumber
byte[]
? Mengapa tidak langsung menulis saja ke soketObjectOutputStream
, dan membacanya denganObjectInputStream
?new ObjectMapper().writeValueAsBytes(JAVA_OBJECT_HERE)
Jawaban:
Siapkan array byte untuk dikirim:
Buat objek dari array byte:
sumber
ObjectInput
,ObjectOuput
,ByteArrayOutputStream
DanByteArrayInputStream
semua mengimplementasikanAutoCloseable
antarmuka, tidak akan itu akan praktik yang baik untuk menggunakannya untuk menghindari hilang menutup mereka dengan kesalahan? (Saya tidak sepenuhnya yakin apakah ini adalah praktek terbaik, itu sebabnya aku bertanya-tanya.) Contoh:try(ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out = new ObjectOutputStream(bos)){ /*Do stuff*/ }catch(IOException e){/*suppress exception*/}
. Ini juga menghilangkan kebutuhan untukfinal
klausa dan tambahannyatry-catch
.Cara terbaik untuk melakukannya adalah menggunakan
SerializationUtils
dari Apache Commons Lang .Membuat cerita bersambung:
Deserialize:
Seperti yang disebutkan, ini membutuhkan perpustakaan Commons Lang. Itu dapat diimpor menggunakan Gradle:
Maven:
File jar
Dan banyak lagi cara yang disebutkan di sini
Atau, seluruh koleksi dapat diimpor. Lihat tautan ini
sumber
Jika Anda menggunakan Java> = 7, Anda dapat meningkatkan solusi yang diterima menggunakan coba dengan sumber daya :
Dan sebaliknya:
sumber
Dapat dilakukan dengan SerializationUtils , dengan metode serialisasi & deserialize oleh ApacheUtils untuk mengonversi objek ke byte [] dan sebaliknya, seperti yang dinyatakan dalam jawaban @uris.
Untuk mengonversi objek ke byte [] dengan membuat serial:
Untuk mengonversi byte [] ke objek dengan deserializing ::
Klik tautan untuk Unduh org-apache-commons-lang.jar
Integrasikan file .jar dengan mengklik:
FileName -> Buka Medule Settings -> Pilih modul Anda -> Dependensi -> Add file Jar dan Anda selesai.
Semoga ini bisa membantu .
sumber
Saya juga merekomendasikan untuk menggunakan alat SerializationUtils. Saya ingin membuat ajust pada komentar yang salah oleh @Abilash. The
SerializationUtils.serialize()
Metode ini tidak terbatas pada 1024 byte, bertentangan dengan jawaban lain di sini.Pada pandangan pertama, Anda mungkin berpikir itu
new ByteArrayOutputStream(1024)
hanya akan memungkinkan ukuran yang tetap. Tetapi jika Anda mencermatiByteArrayOutputStream
, Anda akan mengetahui aliran akan tumbuh jika perlu:sumber
sumber
Metode lain yang menarik adalah dari
com.fasterxml.jackson.databind.ObjectMapper
byte[] data = new ObjectMapper().writeValueAsBytes(JAVA_OBJECT_HERE)
Ketergantungan Maven
sumber
Kerangka Pegas
org.springframework.util.SerializationUtils
sumber
Jika Anda menggunakan pegas, ada kelas util yang tersedia di pegas-inti. Anda cukup melakukannya
sumber
contoh kode dengan java 8+:
sumber
Jika Anda menginginkan solusi copy-paste tanpa ketergantungan yang bagus. Ambil kode di bawah ini.
Contoh
Sumber
sumber
Ini hanya bentuk kode yang dioptimalkan dari jawaban yang diterima jika ada yang ingin menggunakan ini dalam produksi:
sumber