Java實(shí)現(xiàn)將對(duì)象轉(zhuǎn)換為二進(jìn)制流再轉(zhuǎn)為Base64字符串
在Java中將對(duì)象轉(zhuǎn)換為二進(jìn)制流再轉(zhuǎn)為Base64字符串,通常涉及序列化過程。以下是幾種實(shí)現(xiàn)方式:
1. 使用標(biāo)準(zhǔn)Java序列化
import java.io.*;
import java.util.Base64;
public class ObjectToBase64 {
// 對(duì)象必須實(shí)現(xiàn)Serializable接口
static class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
/**
* 對(duì)象序列化為Base64字符串
*/
public static String objectToBase64(Serializable obj) throws IOException {
// 序列化對(duì)象到字節(jié)數(shù)組
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(obj);
}
// 將字節(jié)數(shù)組轉(zhuǎn)為Base64
return Base64.getEncoder().encodeToString(baos.toByteArray());
}
/**
* 從Base64字符串反序列化對(duì)象
*/
public static Object base64ToObject(String base64Str)
throws IOException, ClassNotFoundException {
// Base64解碼為字節(jié)數(shù)組
byte[] data = Base64.getDecoder().decode(base64Str);
// 從字節(jié)數(shù)組反序列化對(duì)象
ByteArrayInputStream bais = new ByteArrayInputStream(data);
try (ObjectInputStream ois = new ObjectInputStream(bais)) {
return ois.readObject();
}
}
public static void main(String[] args) {
try {
// 創(chuàng)建測(cè)試對(duì)象
Person person = new Person("張三", 25);
// 序列化為Base64
String base64 = objectToBase64(person);
System.out.println("Base64字符串: " + base64);
// 反序列化
Person restoredPerson = (Person) base64ToObject(base64);
System.out.println("反序列化對(duì)象: " + restoredPerson);
} catch (Exception e) {
e.printStackTrace();
}
}
}2. 使用JSON序列化(推薦)
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Base64;
public class JsonToBase64 {
static class Product {
private String id;
private String name;
private double price;
// 無參構(gòu)造函數(shù)
public Product() {}
public Product(String id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
// getters and setters
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public double getPrice() { return price; }
public void setPrice(double price) { this.price = price; }
}
/**
* 對(duì)象轉(zhuǎn)Base64(JSON格式)
*/
public static String toBase64(Object obj) throws Exception {
ObjectMapper mapper = new ObjectMapper();
byte[] jsonBytes = mapper.writeValueAsBytes(obj);
return Base64.getEncoder().encodeToString(jsonBytes);
}
/**
* Base64轉(zhuǎn)對(duì)象
*/
public static <T> T fromBase64(String base64Str, Class<T> clazz)
throws Exception {
ObjectMapper mapper = new ObjectMapper();
byte[] jsonBytes = Base64.getDecoder().decode(base64Str);
return mapper.readValue(jsonBytes, clazz);
}
public static void main(String[] args) {
try {
Product product = new Product("P001", "筆記本電腦", 5999.99);
// 轉(zhuǎn)為Base64
String base64 = toBase64(product);
System.out.println("Base64字符串: " + base64);
// 從Base64恢復(fù)
Product restored = fromBase64(base64, Product.class);
System.out.println("恢復(fù)的對(duì)象: " +
"id=" + restored.getId() +
", name=" + restored.getName() +
", price=" + restored.getPrice());
} catch (Exception e) {
e.printStackTrace();
}
}
}3. 使用Apache Commons工具類
import org.apache.commons.codec.binary.Base64;
import java.io.*;
public class CommonsBase64Util {
/**
* 序列化對(duì)象到Base64字符串
*/
public static String serializeToBase64(Serializable obj) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(obj);
}
return Base64.encodeBase64String(baos.toByteArray());
}
/**
* 從Base64字符串反序列化對(duì)象
*/
public static Object deserializeFromBase64(String base64Str)
throws IOException, ClassNotFoundException {
byte[] data = Base64.decodeBase64(base64Str);
ByteArrayInputStream bais = new ByteArrayInputStream(data);
try (ObjectInputStream ois = new ObjectInputStream(bais)) {
return ois.readObject();
}
}
}4. 封裝工具類
import java.io.*;
import java.util.Base64;
public class SerializationUtils {
/**
* 將對(duì)象序列化為Base64字符串
*/
public static String serializeToBase64(Serializable object) {
if (object == null) {
return null;
}
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(object);
oos.flush();
return Base64.getEncoder().encodeToString(baos.toByteArray());
} catch (IOException e) {
throw new RuntimeException("序列化失敗", e);
}
}
/**
* 從Base64字符串反序列化對(duì)象
*/
@SuppressWarnings("unchecked")
public static <T> T deserializeFromBase64(String base64Str) {
if (base64Str == null || base64Str.isEmpty()) {
return null;
}
byte[] data = Base64.getDecoder().decode(base64Str);
try (ByteArrayInputStream bais = new ByteArrayInputStream(data);
ObjectInputStream ois = new ObjectInputStream(bais)) {
return (T) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
throw new RuntimeException("反序列化失敗", e);
}
}
/**
* 安全的反序列化,避免反序列化漏洞
*/
public static <T> T safeDeserializeFromBase64(String base64Str, Class<T> expectedClass) {
if (base64Str == null || base64Str.isEmpty()) {
return null;
}
byte[] data = Base64.getDecoder().decode(base64Str);
try (ByteArrayInputStream bais = new ByteArrayInputStream(data);
ObjectInputStream ois = new ObjectInputStream(bais)) {
Object obj = ois.readObject();
if (expectedClass.isInstance(obj)) {
return expectedClass.cast(obj);
} else {
throw new RuntimeException("反序列化類型不匹配");
}
} catch (IOException | ClassNotFoundException e) {
throw new RuntimeException("反序列化失敗", e);
}
}
}5. 使用示例
public class Example {
// 定義可序列化的類
static class User implements Serializable {
private static final long serialVersionUID = 1L;
private String username;
private String email;
private transient String password; // transient字段不會(huì)被序列化
public User(String username, String email, String password) {
this.username = username;
this.email = email;
this.password = password;
}
// getters and setters
}
public static void main(String[] args) {
// 創(chuàng)建對(duì)象
User user = new User("john_doe", "john@example.com", "secret123");
// 序列化為Base64
String base64 = SerializationUtils.serializeToBase64(user);
System.out.println("Base64: " + base64);
System.out.println("長(zhǎng)度: " + base64.length());
// 反序列化
User restoredUser = SerializationUtils.deserializeFromBase64(base64);
System.out.println("用戶名: " + restoredUser.username);
System.out.println("郵箱: " + restoredUser.email);
System.out.println("密碼: " + restoredUser.password); // 為null,因?yàn)槭莟ransient
}
}注意事項(xiàng)
安全性:Java原生序列化存在安全風(fēng)險(xiǎn),可能被惡意利用
版本兼容:序列化對(duì)象修改后,舊版本可能無法反序列化
性能:JSON序列化通常比Java原生序列化更高效
transient字段:使用transient關(guān)鍵字標(biāo)記的字段不會(huì)被序列化
serialVersionUID:建議顯式定義,避免自動(dòng)生成導(dǎo)致版本兼容問題
推薦方案
- 網(wǎng)絡(luò)傳輸或存儲(chǔ):推薦使用JSON + Base64
- 本地持久化:考慮使用protobuf、Avro等二進(jìn)制格式
- 安全性要求高:避免使用Java原生序列化,使用JSON或自定義序列化
選擇哪種方式取決于具體需求,JSON方式更通用、更安全,而Java原生序列化更適合Java系統(tǒng)間的通信。
到此這篇關(guān)于Java實(shí)現(xiàn)將對(duì)象轉(zhuǎn)換為二進(jìn)制流再轉(zhuǎn)為Base64字符串的文章就介紹到這了,更多相關(guān)Java對(duì)象轉(zhuǎn)Base64字符串內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中Json字符串和Java對(duì)象的互轉(zhuǎn)
- Java對(duì)象和JSON字符串之間的轉(zhuǎn)換方法(全網(wǎng)最清晰)
- java中對(duì)象轉(zhuǎn)json字符串的三種常用方式
- Java中String字符串轉(zhuǎn)具體對(duì)象的幾種常用方式
- java中對(duì)象轉(zhuǎn)json字符串的幾種常用方式舉例
- Java實(shí)現(xiàn)Json字符串與Object對(duì)象相互轉(zhuǎn)換的方式總結(jié)
- Java中將base64編碼字符串轉(zhuǎn)換為圖片的代碼
- 基于Java實(shí)現(xiàn)文件和base64字符串轉(zhuǎn)換
相關(guān)文章
jenkins和sonar實(shí)現(xiàn)代碼檢測(cè)過程詳解
這篇文章主要介紹了jenkins和sonar實(shí)現(xiàn)代碼檢測(cè)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Java代碼統(tǒng)計(jì)網(wǎng)站中不同省份用戶的訪問數(shù)
這篇文章主要介紹了Java代碼統(tǒng)計(jì)網(wǎng)站中不同省份用戶的訪問數(shù) 的相關(guān)資料,非常具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-05-05
Collection中的size()和isEmpty()區(qū)別說明
這篇文章主要介紹了Collection中的size()和isEmpty()區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
java實(shí)現(xiàn)表單必填參數(shù)驗(yàn)證的方法
表單校驗(yàn)是很多注冊(cè)時(shí)必做的功能, 一般我們的處理都是很粗暴的寫個(gè)if()判斷, 然后拋異常. 本文將介紹通過代理的思想, 用注解優(yōu)雅的處理非空判斷,感興趣的一起來了解一下2021-05-05
Java基礎(chǔ)之詳細(xì)總結(jié)五種常用運(yùn)算符
在通常代碼邏輯處理中,我們常常都會(huì)使用到運(yùn)算符,今天我們就詳細(xì)了解一下運(yùn)算符的使用以及分類.運(yùn)算符是對(duì)常量或者變量進(jìn)行操作的符號(hào),它分為算術(shù)運(yùn)算符,賦值運(yùn)算符,比較運(yùn)算符,邏輯運(yùn)算符以及位運(yùn)算符.需要的朋友可以參考下2021-05-05
Java反轉(zhuǎn)數(shù)組輸出實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于Java反轉(zhuǎn)數(shù)組輸出以及利用Java實(shí)現(xiàn)字符串逆序輸出的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
零基礎(chǔ)寫Java知乎爬蟲之先拿百度首頁(yè)練練手
本來打算這篇文章直接抓取知乎的,但是想想還是先來個(gè)簡(jiǎn)單的吧,初級(jí)文章適合初學(xué)者,高手們請(qǐng)直接略過2014-11-11
SpringSecurity頁(yè)面授權(quán)與登錄驗(yàn)證實(shí)現(xiàn)(內(nèi)存取值與數(shù)據(jù)庫(kù)取值)
Spring Security是一個(gè)能夠?yàn)榛赟pring的企業(yè)應(yīng)用系統(tǒng)提供聲明式的安全訪問控制解決方案的安全框架,本文主要介紹了SpringSecurity頁(yè)面授權(quán)與登錄驗(yàn)證實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06

