Java中如何将字符串化对象转换为原对象?求对象转字符串存储方案
Java对象与字符串的互转方案
你提到的Dog@d716361是Java对象默认toString()方法的输出,仅包含类名和对象哈希码,无法还原为原对象——因为它没有保存对象的实际属性数据。下面提供几种可行的对象与字符串互转方案:
一、手动实现序列化/反序列化(轻量无依赖)
通过重写toString()输出包含属性的结构化字符串,再编写解析方法重建对象,适合简单类场景:
修改后的Dog类
public class Dog { private String name; Dog(String n) { name = n; } public String getName() { return name; } // 重写toString,输出带属性的结构化字符串 @Override public String toString() { return "Dog:name=" + name; } // 静态解析方法,从字符串重建对象 public static Dog fromString(String str) { if (str == null || !str.startsWith("Dog:name=")) { throw new IllegalArgumentException("无效的Dog字符串格式"); } String name = str.substring("Dog:name=".length()); return new Dog(name); } }
使用示例
public class Main { public static void main(String[] args) { Dog dog = new Dog("旺财"); // 对象转字符串 String dogStr = dog.toString(); System.out.println(dogStr); // 输出:Dog:name=旺财 // 字符串转回对象 Dog restoredDog = Dog.fromString(dogStr); System.out.println(restoredDog.getName()); // 输出:旺财 } }
二、Java原生序列化(Serializable接口)
让类实现Serializable接口,通过字节流转Base64字符串实现序列化,适合Java内部系统间的对象传输:
修改后的Dog类
import java.io.Serializable; public class Dog implements Serializable { // 显式声明序列化版本号,避免类结构变化导致反序列化失败 private static final long serialVersionUID = 1L; private String name; Dog(String n) { name = n; } public String getName() { return name; } }
序列化工具类
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Base64; public class SerializationUtils { // 对象转Base64字符串 public static String serialize(Object obj) throws Exception { ByteArrayOutputStream bos = new ByteArrayOutputStream(); try (ObjectOutputStream oos = new ObjectOutputStream(bos)) { oos.writeObject(obj); } return Base64.getEncoder().encodeToString(bos.toByteArray()); } // Base64字符串转回对象 public static Object deserialize(String str) throws Exception { byte[] data = Base64.getDecoder().decode(str); try (ByteArrayInputStream bis = new ByteArrayInputStream(data); ObjectInputStream ois = new ObjectInputStream(bis)) { return ois.readObject(); } } }
使用示例
public class Main { public static void main(String[] args) throws Exception { Dog dog = new Dog("旺财"); // 对象转字符串 String dogStr = SerializationUtils.serialize(dog); System.out.println(dogStr); // 输出Base64编码的字符串 // 字符串转回对象 Dog restoredDog = (Dog) SerializationUtils.deserialize(dogStr); System.out.println(restoredDog.getName()); // 输出:旺财 } }
三、JSON序列化(跨语言通用)
使用第三方JSON库(如Gson、Jackson)将对象转为可读性强的JSON字符串,适合跨语言场景或复杂类结构:
以Gson为例的使用示例
确保项目引入Gson库后,编写代码:
import com.google.gson.Gson; public class Main { public static void main(String[] args) { Gson gson = new Gson(); Dog dog = new Dog("旺财"); // 对象转JSON字符串 String dogJson = gson.toJson(dog); System.out.println(dogJson); // 输出:{"name":"旺财"} // JSON字符串转回对象 Dog restoredDog = gson.fromJson(dogJson, Dog.class); System.out.println(restoredDog.getName()); // 输出:旺财 } }
注意:若使用Gson,建议给
Dog类添加无参构造方法,或配置Gson支持私有构造,避免解析失败。
内容的提问来源于stack exchange,提问作者Ron Caspi
相关产品推荐
相关产品推荐

