如何将可序列化对象转为字符串且无需写入本地文件
实现方案
核心逻辑是用内存字节流代替文件流,序列化得到的字节数组通过Base64编码转为可安全存储的字符串,反序列化时先把Base64字符串解码回字节数组再读取对象。
完整代码示例
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Base64; // 实现Serializable接口的业务类 class SomeClass implements Serializable { private static final long serialVersionUID = 1L; // 显式声明序列化ID,避免版本兼容问题 private String name; private int age; public SomeClass(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "SomeClass{name='" + name + "', age=" + age + "}"; } } public class SerializeUtils { // 对象序列化转为Base64字符串 public static String serializeToString(Serializable obj) throws Exception { ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream objOut = new ObjectOutputStream(byteOut); objOut.writeObject(obj); objOut.close(); // 字节数组转Base64字符串,避免不可见字符导致数据损坏 return Base64.getEncoder().encodeToString(byteOut.toByteArray()); } // Base64字符串反序列化为原对象 public static <T> T deserializeFromString(String str) throws Exception { byte[] bytes = Base64.getDecoder().decode(str); ByteArrayInputStream byteIn = new ByteArrayInputStream(bytes); ObjectInputStream objIn = new ObjectInputStream(byteIn); T obj = (T) objIn.readObject(); objIn.close(); return obj; } // 测试方法 public static void main(String[] args) throws Exception { SomeClass original = new SomeClass("测试用户", 25); System.out.println("原对象:" + original); // 转字符串 String serializeStr = serializeToString(original); System.out.println("序列化后字符串:" + serializeStr); // 还原对象 SomeClass restored = deserializeFromString(serializeStr); System.out.println("还原后对象:" + restored); } }
注意事项
- 所有要序列化的类必须显式声明
serialVersionUID,避免类结构变更后反序列化失败 - Base64编码会让序列化结果比原字节数组大1/3左右,如果对存储体积有要求可以先压缩字节数组再编码
- 不要用普通的字节转字符串方式(比如
new String(bytes)),序列化产生的字节包含大量不可见字符,转普通字符串会出现数据丢失
内容的提问来源于stack exchange,提问作者MUKHTAR INAMDAR
相关产品推荐
相关产品推荐

