Java 对象与字符串的双向映射:高效配置序列化与反序列化指南

java 对象与字符串的双向映射:高效配置序列化与反序列化指南

本文旨在提供高效且易于维护的方法,解决 Java 对象与特定格式字符串之间的双向映射问题。在需要将 Java 对象的配置信息以特定格式(如 a1:0.1|a2:0.5|fl:true)传递或存储时,手动编写序列化和反序列化逻辑容易出错且难以维护。本文将介绍三种不同的方法:使用 JSON 库、利用 Properties 类以及借助 Scanner 类,来优雅地实现对象字段与字符串之间的双向映射,避免硬编码,提高代码的可读性和可维护性。

方案一:使用 JSON 库

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,非常适合用于序列化和反序列化 Java 对象。通过使用像 Jackson 这样的 JSON 库,可以轻松地将 Java 对象转换为 JSON 字符串,反之亦然。

示例代码:

首先,需要添加 Jackson 依赖到你的项目中。 如果使用 Maven,可以在 pom.xml 文件中添加以下依赖:

立即学习“Java免费学习笔记(深入)”;

    com.fasterxml.jackson.core    jackson-databind    2.13.0 

然后,创建包含 @JsonProperty 注解的 Config 类:

import com.fasterxml.jackson.annotation.JsonProperty;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;public class Config {    @JsonProperty("a1")    private float arg1;    @JsonProperty("a2")    private float arg2;    @JsonProperty("fl")    private boolean flag;    // Getters and setters (建议添加)    public float getArg1() {        return arg1;    }    public void setArg1(float arg1) {        this.arg1 = arg1;    }    public float getArg2() {        return arg2;    }    public void setArg2(float arg2) {        this.arg2 = arg2;    }    public boolean isFlag() {        return flag;    }    public void setFlag(boolean flag) {        this.flag = flag;    }    public static void main(String... args) throws JsonProcessingException {        Config config = new Config();        config.setArg1(0.1f);        config.setArg2(0.5f);        config.setFlag(true);        ObjectMapper mapper = new ObjectMapper();        String json = mapper.writeValueAsString(config);        System.out.println("JSON: " + json); // 输出: {"a1":0.1,"a2":0.5,"fl":true}        Config res = mapper.readValue(json, Config.class);        System.out.println("arg1: " + res.getArg1()); // 输出: arg1: 0.1        System.out.println("arg2: " + res.getArg2()); // 输出: arg2: 0.5        System.out.println("flag: " + res.isFlag());  // 输出: flag: true    }}

说明:

@JsonProperty(“a1”) 注解用于指定 JSON 字符串中字段 a1 对应于 Config 类的 arg1 字段。ObjectMapper 类负责将 Java 对象序列化为 JSON 字符串 (writeValueAsString),以及将 JSON 字符串反序列化为 Java 对象 (readValue)。务必包含 getter 和 setter 方法,Jackson 需要通过这些方法访问和设置字段值。

优点:

简洁易用,代码量少。可读性强,JSON 格式清晰明了。通用性强,JSON 是一种广泛使用的数据交换格式。

缺点:

需要引入额外的 JSON 库依赖。JSON 字符串可能比其他格式更冗长。

方案二:使用 Properties 类

Java 的 Properties 类提供了一种简单的方式来存储和加载键值对。可以将 Java 对象的字段作为键,字段值作为值,存储到 Properties 对象中,然后将其保存到文件或输出流中。

示例代码:

import java.io.*;import java.util.Properties;public class Config {    private static final String A1 = "a1";    private static final String A2 = "a2";    private static final String FL = "fl";    private float arg1;    private float arg2;    private boolean flag;    public float getArg1() {        return arg1;    }    public void setArg1(float arg1) {        this.arg1 = arg1;    }    public float getArg2() {        return arg2;    }    public void setArg2(float arg2) {        this.arg2 = arg2;    }    public boolean isFlag() {        return flag;    }    public void setFlag(boolean flag) {        this.flag = flag;    }    public void store(OutputStream out) throws IOException {        Properties properties = new Properties();        properties.setProperty(A1, String.valueOf(arg1));        properties.setProperty(A2, String.valueOf(arg2));        properties.setProperty(FL, String.valueOf(flag));        properties.store(out, "Config data");    }    public static Config load(InputStream in) throws IOException {        Properties properties = new Properties();        properties.load(in);        Config config = new Config();        config.setArg1(Float.parseFloat(properties.getProperty(A1, String.valueOf(0.f))));        config.setArg2(Float.parseFloat(properties.getProperty(A2, String.valueOf(0.f))));        config.setFlag(Boolean.parseBoolean(properties.getProperty(FL, String.valueOf(false))));        return config;    }    public static void main(String... args) throws IOException {        Config config = new Config();        config.setArg1(0.1f);        config.setArg2(0.5f);        config.setFlag(true);        File file = new File("foo.properties");        if (file.exists()) {            file.delete();        }        file.createNewFile();        try (OutputStream out = new FileOutputStream(file, false)) {            config.store(out);        }        Config res = null;        try (InputStream in = new FileInputStream(file)) {            res = Config.load(in);        }        System.out.println("arg1: " + res.getArg1()); // 输出: arg1: 0.1        System.out.println("arg2: " + res.getArg2()); // 输出: arg2: 0.5        System.out.println("flag: " + res.isFlag());  // 输出: flag: true    }}

说明:

store(OutputStream out) 方法将 Config 对象的字段存储到 Properties 对象中,然后将 Properties 对象写入到输出流。load(InputStream in) 方法从输入流中读取 Properties 对象,然后将 Properties 对象中的值设置到 Config 对象的字段中。使用常量来定义属性名称,提高代码可读性和可维护性。getProperty(key, defaultValue) 方法在属性不存在时提供默认值,避免空指针异常。

优点:

简单易用,无需引入额外的依赖。可读性较好,Properties 文件格式清晰。支持注释,可以添加描述信息。

缺点:

只支持字符串类型的键和值,需要手动进行类型转换。不适合存储复杂的数据结构。

方案三:使用 Scanner 类

Scanner 类可以用于解析字符串,并将其转换为不同的数据类型。可以自定义序列化和反序列化逻辑,使用分隔符将 Java 对象的字段连接成字符串,然后使用 Scanner 类解析该字符串。

示例代码:

import java.io.IOException;import java.util.Locale;import java.util.Scanner;public class Config {    private static final String A1 = "a1";    private static final String A2 = "a2";    private static final String FL = "fl";    private static final String DELIMITER = ":";    private float arg1;    private float arg2;    private boolean flag;    public float getArg1() {        return arg1;    }    public void setArg1(float arg1) {        this.arg1 = arg1;    }    public float getArg2() {        return arg2;    }    public void setArg2(float arg2) {        this.arg2 = arg2;    }    public boolean isFlag() {        return flag;    }    public void setFlag(boolean flag) {        this.flag = flag;    }    public String serialize() throws IOException {        StringBuilder buf = new StringBuilder();        buf.append(A1).append(DELIMITER).append(arg1).append('');        buf.append(A2).append(DELIMITER).append(arg2).append('');        buf.append(FL).append(DELIMITER).append(flag).append('');        return buf.toString();    }    public static Config deserialize(String str) {        Scanner scan = new Scanner(str);        scan.useDelimiter(DELIMITER + "|n");        scan.useLocale(Locale.ENGLISH);        Config config = new Config();        while (scan.hasNext()) {            switch (scan.next()) {                case A1: config.setArg1(scan.nextFloat()); break;                case A2: config.setArg2(scan.nextFloat()); break;                case FL: config.setFlag(scan.nextBoolean()); break;            }        }        return config;    }    public static void main(String... args) throws IOException {        Config config = new Config();        config.setArg1(0.1f);        config.setArg2(0.5f);        config.setFlag(true);        String str = config.serialize();        Config res = Config.deserialize(str);        System.out.println("arg1: " + res.getArg1()); // 输出: arg1: 0.1        System.out.println("arg2: " + res.getArg2()); // 输出: arg2: 0.5        System.out.println("flag: " + res.isFlag());  // 输出: flag: true    }}

说明:

serialize() 方法使用 StringBuilder 将字段名和值拼接成字符串,使用 DELIMITER 分隔字段名和值,使用换行符分隔不同的字段。deserialize(String str) 方法使用 Scanner 类解析字符串,使用 DELIMITER + “|n” 作为分隔符,将字符串分割成字段名和值,然后将值设置到 Config 对象的字段中。scan.useLocale(Locale.ENGLISH) 确保浮点数解析使用英文格式,避免因本地化设置导致解析错误。

优点:

不需要引入额外的依赖。可以自定义序列化和反序列化逻辑,灵活性高。

缺点:

代码量相对较多。容易出错,需要仔细处理分隔符和数据类型转换。可读性相对较差。

总结

本文介绍了三种不同的方法来实现 Java 对象与字符串之间的双向映射。选择哪种方法取决于具体的应用场景和需求。

如果需要处理复杂的数据结构,并且希望代码简洁易用,建议使用 JSON 库。如果只需要存储简单的键值对,并且不需要引入额外的依赖,可以使用 Properties 类。如果需要自定义序列化和反序列化逻辑,并且对性能有较高的要求,可以使用 Scanner 类。

无论选择哪种方法,都应该尽量避免硬编码映射关系,提高代码的可读性和可维护性。使用常量来定义字段名和分隔符,可以减少出错的可能性。同时,应该编写单元测试来验证序列化和反序列化逻辑的正确性。

以上就是Java 对象与字符串的双向映射:高效配置序列化与反序列化指南的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/142749.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月1日 14:46:06
下一篇 2025年12月1日 15:22:38

相关推荐

  • 最新虚拟货币交易入口 十大虚拟货币交易入口最新地址

    最新虚拟货币交易入口地址 1. Binance Binance(币安)继续以其庞大的生态系统和无可匹敌的交易深度,稳坐全球最大虚拟货币交易平台的宝座。其现货和衍生品市场的交易量长期占据行业领先地位,为用户提供了极佳的流动性,这意味着交易者可以以更小的滑点完成大额订单。Binance的成功很大程度上归…

    2025年12月8日 好文分享
    000
  • 必安和欧意okx的对比 2025最全分析完整版

    探讨全球数字资产交易领域的两个重要平台,必安与欧意okx,并分析它们在功能、服务及用户体验上的不同之处。 必安 作为全球知名的数字资产交易平台,必安拥有庞大的用户基础和极高的交易量。它提供涵盖现货、合约、期权等多种交易产品,并不断扩展其生态系统,包括Launchpad、挖矿池、NFT市场等。平台的服…

    好文分享 2025年12月8日
    000
  • 必安binance和火币htx怎么选 全面分析2025

    在快速演变的加密货币市场中,选择一个合适的数字资产交易平台是投资者与交易者面临的关键决策。两大全球性交易所——必安(binance)与火币(htx,前身为火币global)长期以来占据着重要地位,它们各自拥有庞大的用户基础和独特的平台特性。进入2025年,市场格局、监管环境以及技术发展都在不断变化,…

    2025年12月8日
    000
  • 2025虚拟币交易平台app最新排行榜

    2025最新虚拟货币交易平台 1. Binance binance(币安)继续以其庞大的生态系统和无可匹敌的交易深度,稳坐全球最大虚拟货币交易平台的宝座。其现货和衍生品市场的交易量长期占据行业领先地位,为用户提供了极佳的流动性,这意味着交易者可以以更小的滑点完成大额订单。binance的成功很大程度…

    2025年12月8日 好文分享
    000
  • 全球顶级数字货币交易平台2025年TOP10

    数字货币交易平台在全球范围内提供了连接买卖双方、促进资产流通的关键基础设施。这些平台各具特色,服务于不同类型的用户群体,从新手投资者到专业交易员乃至机构客户。它们的运营规模、提供的交易产品、用户体验、安全措施以及合规状况构成了用户选择时考量的重要因素。 数字资产交易市场的活跃度不断变化,各平台在技术…

    2025年12月8日 好文分享
    000
  • 虚拟货币交易所最新排行2025全球十大平台

    虚拟货币交易平台在全球数字资产市场中扮演着核心角色。它们提供了加密货币与法定货币或不同加密货币之间进行交换的场所。一个优秀的交易平台通常具备高流动性、广泛的资产覆盖范围以及可靠的安全措施。交易平台的功能远不止简单的买卖,它们往往还提供衍生品交易、理财服务、质押等多种功能,以满足不同用户的需求。 虚拟…

    2025年12月8日 好文分享
    000
  • 如何在币安、欧易、火币中做出最佳选择?

    在数字资产交易领域,币安、欧易和火币都是具有影响力的平台。对于投资者而言,了解它们各自的特点并进行比较,对于做出符合自身需求的决策至关重要。 币安 币安是全球知名的加密货币交易所,以其庞大的交易量和广泛的数字资产种类著称。平台提供现货、合约、期权等多种交易产品,并不断拓展其生态系统服务。 欧易 欧易…

    2025年12月8日
    000
  • 加密更新:FXWirePro关于新兴趋势和关键发展的见解

    在加密世界的高速发展中抢占先机! fxwirepro为您带来最新动态,涵盖新项目上线到前沿区块链技术,所有信息尽在此处。 嘿,加密爱好者们!你是否曾在数字资产和区块链术语的洪流中感到迷失?别担心。FXWirePro为你带来最新的加密资讯,让你轻松掌握热点趋势,不再错过关键动态。现在就一起来看看有哪些…

    2025年12月8日
    000
  • 全球三大交易所如何选择 全方位硬核分析

    选择合适的加密货币交易所是参与数字资产市场的关键第一步。不同的平台在提供的服务、安全性以及用户体验上存在差异。了解全球主要交易所的特点,对于做出明智的决定至关重要。 主要交易所介绍 Binance 作为全球用户量和交易量领先的平台,Binance提供了极为丰富的数字资产交易对和多元化服务。它不仅支持…

    2025年12月8日
    000
  • 币安、欧易、火币(HTX)交易所的10大核心区别全解析

    币安 币安官网直达: 币安交易所于2017年成立,由赵长鹏创立,迅速成长为全球交易量领先的加密货币交易所。它提供广泛的数字资产交易服务,包括现货交易、期货、期权、杠杆交易以及其他金融产品。币安以其高流动性、丰富的交易对和相对较低的交易费用而闻名。其技术架构旨在处理高并发交易,确保系统稳定运行。平台的…

    2025年12月8日
    000
  • 全球三大交易所PK:币安、欧易、火币谁是真正的王者?

    在全球数字资产交易领域,几个平台因其巨大的交易量、广泛的用户基础和多样的服务而脱颖而出。它们不仅是买卖加密货币的场所,更是连接用户与区块链世界的桥梁。在众多参与者中,有几个名字长期占据着核心位置,它们之间的竞争与发展,深刻影响着整个行业的格局。理解这些平台的特点和区别,对于寻求进入或深入数字资产市场…

    2025年12月8日
    000
  • 2025年加密货币:新兴项目要观看

    探索2025年的加密货币世界,聚焦qubetics、troller cat以及其他具备增长潜力的新锐项目。 2025年加密货币趋势:值得关注的新兴项目 随着我们迈入2025年,加密市场再次活跃起来。比特币持续刷新历史高点,投资者也在寻找下一个可能爆发的项目。本文将介绍一些有望在新的一年中脱颖而出的新…

    2025年12月8日
    000
  • 核心科学:从加密矿工到AI Powerhouse?交易谈话升温!

    core scientific的股价在与ai云服务商coreweave重启收购谈判的消息传出后大幅上涨,突显出这家加密货币矿工正成功向人工智能基础设施领域转型。 核心科学:从加密挖矿到AI巨头?并购传闻引爆市场! =============================== Core Scient…

    2025年12月8日
    000
  • 币安、欧易、HTX哪个更适合你?三大交易所优劣势深度剖析

    币安 (Binance) 币安作为当前全球用户数量与交易量最大的加密货币交易平台之一,提供广泛的加密资产交易服务。其生态系统庞大,涵盖现货、合约、期权交易,以及质押、借贷、NFT市场和IEO平台Launchpad等。币安链(BNB Chain)的发展也为其生态系统注入了活力,BNB作为平台币在全球范…

    2025年12月8日
    000
  • 十大货币交易入口地址大全

    虚拟货币交易入口地址 1. Binance Binance(币安)继续以其庞大的生态系统和无可匹敌的交易深度,稳坐全球最大虚拟货币交易平台的宝座。其现货和衍生品市场的交易量长期占据行业领先地位,为用户提供了极佳的流动性,这意味着交易者可以以更小的滑点完成大额订单。Binance的成功很大程度上归功于…

    2025年12月8日 好文分享
    000
  • 比特币,黑客和印度储备:加密鸡尾酒

    从使用比特币的黑客到印度考虑比特币储备,加密货币世界永远不会睡觉。让我们分解最新。 比特币,黑客和印度储备:加密鸡尾酒 比特币展现出的韧性不断受到挑战。从大规模黑客攻击到印度可能将比特币纳入储备体系,最近的动态凸显了加密货币的多面性,在这里创新与风险持续交织。 黑客落网:比特币在网络犯罪中的角色 据…

    2025年12月8日
    000
  • 必安和欧意如何选择 全方位分析

    必安 必安是全球范围内用户基数庞大、交易量名列前茅的数字资产交易平台。该平台提供了极其丰富的加密货币交易对,覆盖了从比特币、以太坊等主流币到许多新兴的DeFi、NFT和GameFi项目代币。必安不仅是一个交易场所,它还构建了一个围绕其原生代币BNB的庞大生态系统,包括币安智能链(BNB Chain)…

    2025年12月8日
    000
  • PI硬币价格预测今天:它会释放吗?

    分析6月27日pi coin价格走势及其未来影响因素:genai整合与pi2day hype能否抵消代币解锁压力? Pi Coin近期的表现可谓跌宕起伏,令投资者情绪波动剧烈。它究竟会迎来上涨还是面临崩盘?让我们聚焦今日Pi Coin的市场动态及未来价格预测。 当前Pi币价格:陷入震荡区间? 截至6…

    2025年12月8日
    000
  • 虚拟币交易所哪个好?2025新手必看!

    在数字资产日益成为全球关注焦点的当下,选择一个可靠、易用的交易平台是迈入这个领域的第一步。对于刚开始探索虚拟货币世界的新手来说,理解不同交易平台的特点和优势,是做出明智选择的关键。以下将对几个市场上备受关注的虚拟币交易平台进行介绍和对比,希望能为你提供参考。 Binance 作为全球用户量和交易量较…

    2025年12月8日
    000
  • 哪个交易所比较靠谱 十大交易所全方位对比分析

    币安 (Binance) 币安是全球领先的加密货币交易所,提供广泛的数字资产交易服务。它于2017年由赵长鹏创立,迅速发展成为交易量最大的平台之一。币安平台支持多种交易对,包括现货交易、合约交易、期权交易等。除了交易功能,币安生态系统还涵盖了Launchpad(新币发行平台)、币安智能链(BNB C…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信