静安网站建设门户网站建设方案

常州微品推文化传媒有限公司 2026/09/09 18:59:53

在Java中将对象转换为二进制流再转为Base64字符串,通常涉及序列化过程。以下是几种实现方式:

1. 使用标准Java序列化

import java.io.*; import java.util.Base64; public class ObjectToBase64 { // 对象必须实现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 + "}"; } } /** * 对象序列化为Base64字符串 */ public static String objectToBase64(Serializable obj) throws IOException { // 序列化对象到字节数组 ByteArrayOutputStream baos = new ByteArrayOutputStream(); try (ObjectOutputStream oos = new ObjectOutputStream(baos)) { oos.writeObject(obj); } // 将字节数组转为Base64 return Base64.getEncoder().encodeToString(baos.toByteArray()); } /** * 从Base64字符串反序列化对象 */ public static Object base64ToObject(String base64Str) throws IOException, ClassNotFoundException { // Base64解码为字节数组 byte[] data = Base64.getDecoder().decode(base64Str); // 从字节数组反序列化对象 ByteArrayInputStream bais = new ByteArrayInputStream(data); try (ObjectInputStream ois = new ObjectInputStream(bais)) { return ois.readObject(); } } public static void main(String[] args) { try { // 创建测试对象 Person person = new Person("张三", 25); // 序列化为Base64 String base64 = objectToBase64(person); System.out.println("Base64字符串: " + base64); // 反序列化 Person restoredPerson = (Person) base64ToObject(base64); System.out.println("反序列化对象: " + 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; // 无参构造函数 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; } } /** * 对象转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转对象 */ 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); // 转为Base64 String base64 = toBase64(product); System.out.println("Base64字符串: " + base64); // 从Base64恢复 Product restored = fromBase64(base64, Product.class); System.out.println("恢复的对象: " + "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 { /** * 序列化对象到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字符串反序列化对象 */ 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 { /** * 将对象序列化为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字符串反序列化对象 */ @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字段不会被序列化 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) { // 创建对象 User user = new User("john_doe", "john@example.com", "secret123"); // 序列化为Base64 String base64 = SerializationUtils.serializeToBase64(user); System.out.println("Base64: " + base64); System.out.println("长度: " + base64.length()); // 反序列化 User restoredUser = SerializationUtils.deserializeFromBase64(base64); System.out.println("用户名: " + restoredUser.username); System.out.println("邮箱: " + restoredUser.email); System.out.println("密码: " + restoredUser.password); // 为null,因为是transient } }

注意事项

  1. 安全性:Java原生序列化存在安全风险,可能被恶意利用

  2. 版本兼容:序列化对象修改后,旧版本可能无法反序列化

  3. 性能:JSON序列化通常比Java原生序列化更高效

  4. transient字段:使用transient关键字标记的字段不会被序列化

  5. serialVersionUID:建议显式定义,避免自动生成导致版本兼容问题

推荐方案

  1. 网络传输或存储:推荐使用JSON + Base64

  2. 本地持久化:考虑使用protobuf、Avro等二进制格式

  3. 安全性要求高:避免使用Java原生序列化,使用JSON或自定义序列化

选择哪种方式取决于具体需求,JSON方式更通用、更安全,而Java原生序列化更适合Java系统间的通信。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

网站建设项目网站正在建设中

DIgSILENT-PowerFactory电力仿真软件快速上手指南【免费下载链接】DIgSILENT-PowerFactory入门教程DIgSILENT-PowerFactory是一款强大的电力系统

2026/06/30 13:14:34

旅游网站建设方案聊城网站建设

对于每一位即将步入或刚刚踏入职场的学子而言,“实践报告”是连接校园理论与社会实战的关键纽带。它不仅是对实习经历的总结与反思,更是向学校和未来雇主展示你学习能力、工作态度和职

2026/06/30 14:04:08

网站建设服务网站建设一条龙

第一章:C++26 CPU亲和性兼容性概览C++26 标准在多线程与系统级资源控制方面引入了重要增强,其中对 CPU 亲和性的标准化支持成为

2026/06/30 13:36:06

静安网站建设梧州网站建设

近日,饶毅在其个人公众号饶议科学发表《应该给我国的中青年科学家涨薪》,《从国外引进老年科学家:不能是养老享福》文章,呼吁给我国30到55岁的中青

2026/06/30 11:23:55

长春网站建设公司网站建设发展

背景及意义随着信息技术在教育领域的深度融合,传统体测管理模式的技术短板日益凸显。采用Java语言、SpringBoot框架及MySQL数据库开发的学生身体素质测评管理系统,

2026/06/30 12:37:02

佛山网站建设建设银行网站

各位同仁,各位技术探索者们,大家好。今天,我们将深入探讨一个在前端性能优化领域极具挑战性的话题:如何实现大规模列表的“极致”虚拟滚动。我们都知道

2026/06/30 10:31:20

深圳网站建设公司移动网站建设

目录JVM内存结构JVM内存结构中哪些是线程私有的? 哪些是内存共享的JVM内存模型里的堆和栈有什么区别内存泄漏和内存溢出有什么不同JVM内存结构jdk1.6中,方法区的实现是永久代, 而永久代是在堆

2026/06/30 12:44:03

内蒙古网站建设广西网站建设公司

FaceFusion在AI健身教练形象定制中的实践案例在智能健身应用日益普及的今天,用户早已不再满足于“播放视频+跟练”的简单模式。他们渴望更个性化的互动体验——一个既专业又亲切

2026/06/30 12:32:01

南昌网站建设合川网站建设

快速体验打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容:开发一个GRPO智能审批系统,功能包括:1.自动

2026/06/30 13:54:38

诸城网站建设物流网站建设

今年,高校对于毕业论文的ai率管控逐渐提升,越来越多同学开始为论文的ai率过高感到头疼如果你正面对着 73% 的 AI 标红愁眉不展,别慌。下文将我亲测有效的

2026/06/30 11:28:55