You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:15:40