跨类型文本文件,反序列化与类型转换的思考

本文介绍了如何在热更新中将旧的ini数据转换为JSON格式,通过对象替换和编程实现,然后用Node.js读取、分割和序列化数据,最终生成易于使用的JSON文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

应用场景

在编写热更新的时候,我发现了一个古早的 ini 文件,记录了许多有用的数据

由于使用的语言年份较新,没有办法较好地对 ini 文件的相关配置进行支持

所以把这串数据转换成 json、xml、lua 是更有效的办法!

在这里插入图片描述

序列化 - 对象

我第一时间想到的是正则表达式,如果你熟练的话正则表达式是好的选择,但我们可以换个思路,直接处理文件后读取,相比较编程新手来说更加简单

要更改源文件时,请先做好文件备份工作~

替换原内容,方便使用

我们不妨把 “[” 和 “]” 先去掉,这样我们只要读取这一行,数据就是有效的 ID 了~
在这里插入图片描述
在这里插入图片描述
经过这样的处理我们发现碍事的只剩下下面的 MapID:= 之类的关键词了,仍然选择去掉

在这里插入图片描述
获得了这样的结果,很轻松地就可以用最原始的方法来读取入程序并序列化了!

编写程序

这里可以使用 Python、JS、C++ 等你熟悉的语言,举例用 Node.js 了~
在这里插入图片描述
我们先把 telelist.txt 读取到 main.js 文件里面去,试着输出,是成功的:
在这里插入图片描述

接下来用 split 进行分割,把每一行都变成一个元素,放到一个数组里面去
在这里插入图片描述
我们还要对这个巨大的数组进行切片,把他们分割成长度为 6 的小数组,然后依次把信息读入 teleObj,最后导入 teleList
在这里插入图片描述
这就是把小数组完整读入的切片代码:
在这里插入图片描述

取得结果数组

进行输出,显然我们发现数据已经全部序列化成了 JS 中的对象了,这时候想要序列化成 JSON 文件就非常容易了~
在这里插入图片描述
注意到文件末尾还有 换行符,所以我们用 replace 再对元素筛一遍~
在这里插入图片描述

序列化 - JSON

通常高级语言都有 JSON 序列化库,这样即可快速完成 JSON 序列化~

如果你有特殊的格式要求,也可以自行编写~
在这里插入图片描述

打开 .json 文件并 beautify 美化一下格式,就得到了序列化成功后的结果~
在这里插入图片描述

<think>好的,我现在需要回答用户关于对象的序列化反序列化的问题,以及它们的作用。首先,我需要确保自己完全理解这两个概念,然后以清晰的结构解释给用户。 首先,序列化是什么?根据之前的知识,序列化是将对象转换为字节流的过程,以便存储或传输。反序列化则是相反的过程,将字节流转换回对象。接下来,我需要思考如何用中文简洁地表达这些概念,并举例说明。 用户可能想知道为什么需要序列化反序列化。这时候需要提到它们的主要作用,比如持久化存储、网络传输、平台数据交换等。可能还需要提到常见的应用场景,比如RPC框架、缓存机制等。 接下来要考虑是否需要涉及技术细节,比如Java中的Serializable接口,或者其他语言的实现方式。但用户并没有特别指定语言,所以可能需要保持通用,但可以适当举例,比如在Java中的实现,因为用户之前的OOM问题涉及Java,可能用户对Java更熟悉。 另外,需要注意用户可能的疑问点,比如序列化的安全性、不同格式(如JSON、XML、二进制)的区别,以及版本兼容性问题。但根据问题,用户主要问的是基本概念和作用,所以可能需要简要提及这些方面,但不过于深入。 还要确保回答结构清晰,分点说明。比如先定义序列化反序列化,然后作用,再应用场景,最后注意事项或常见问题。这样用户容易理解。 需要检查是否有遗漏的关键点。例如,序列化过程中的注意事项,如transient关键字的使用,或者自定义序列化方法。但可能这些属于进阶内容,用户可能暂时不需要,但可以简单提及。 还要确保使用正确的术语,比如“字节流”、“持久化存储”、“网络传输”等,并避免技术术语过多导致难以理解。可能需要用类比,比如将对象比作文件序列化比作打包文件以便运输,反序列化则是拆包恢复文件。 最后,需要确保回答符合之前系统级指令中的格式要求:行内数学表达式用$...$,独立公式用$$...$$,但在这个问题中可能涉及较少数学内容,所以可能不需要。另外,使用中文,结构清晰,分步骤解释。 现在开始组织内容: 1. 定义序列化反序列化,用简单例子说明。 2. 作用:持久化、传输、平台。 3. 应用场景:RPC、缓存、会话保持。 4. 技术实现举例:如Java的Serializable接口。 5. 注意事项:版本控制、安全性、性能。 检查是否有错误,比如序列化是否仅限Java,或者是否所有语言都有类似机制。需要指出这是通用概念,不同语言实现方式不同。 最后,确保语言口语化,但保持专业性,结构分点明确,帮助用户逐步理解。</think>#### 对象的序列化反序列化 ##### 一、基本概念 1. **序列化(Serialization)** 将**对象的状态**转换为**字节流**(二进制或特定格式的文本)的过程,以便存储到文件、数据库或通过网络传输。 - 例如:将 Java 对象转换为二进制流,或转换为 JSON/XML 字符串。 2. **反序列化(Deserialization)** 将**字节流**恢复为内存中的**对象**的过程,重建对象原有的状态。 - 例如:从 JSON 字符串解析出一个 Java 对象。 ##### 二、核心作用 1. **持久化存储** 将对象保存到磁盘或数据库,实现长期存储。 - 典型场景:游戏存档、用户会话(Session)保存。 2. **网络传输** 对象需进程、机器传输时,必须转换为字节流。 - 典型场景:RPC(远程过程调用)、微服务通信。 3. **平台数据交换** 不同语言或系统间交换数据时,序列化为通用格式(如 JSON、Protobuf)。 - 例如:Java 服务向 Python 服务发送 JSON 格式的数据。 4. **深拷贝** 通过序列化反序列化,实现对象的深度复制(避免引用共享问题)。 ##### 三、技术实现(以 Java 为例) 1. **实现 `Serializable` 接口** 标记对象可序列化: ```java public class User implements Serializable { private String name; private transient int age; // transient 字段不会被序列化 } ``` 2. **序列化反序列化方法** - 使用 `ObjectOutputStream` 和 `ObjectInputStream`: ```java // 序列化 try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.dat"))) { oos.writeObject(user); } // 反序列化 try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.dat"))) { User user = (User) ois.readObject(); } ``` 3. **自定义序列化** 通过 `writeObject` 和 `readObject` 方法控制序列化细节: ```java private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); // 默认序列化 out.writeInt(age); // 手动序列化 transient 字段 } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); this.age = in.readInt(); // 手动反序列化 transient 字段 } ``` ##### 四、常见序列化格式 1. **二进制格式** - **优点**:体积小、速度快。 - **缺点**:不语言、可读性差。 - 工具:Java 原生序列化、Protobuf、Thrift。 2. **文本格式** - **JSON**:通用性强,易读,但体积较大。 ```json {"name": "Alice", "age": 30} ``` - **XML**:结构化强,但冗余度高。 ```xml <User> <name>Alice</name> <age>30</age> </User> ``` ##### 五、注意事项 1. **版本兼容性** - 修改类结构(如增删字段)可能导致反序列化失败,需通过 `serialVersionUID` 显式声明版本: ```java private static final long serialVersionUID = 1L; ``` 2. **安全性风险** - 反序列化恶意数据可能导致代码执行漏洞(如 Java 反序列化漏洞),需对输入严格校验。 3. **性能优化** - 频繁序列化场景下,优先选择高效格式(如 Protobuf 比 JSON 快 3-10 倍)。 ##### 六、典型应用场景 1. **分布式系统通信** - 微服务间通过序列化传输 DTO(Data Transfer Object)。 2. **缓存系统** - Redis 存储对象时需先序列化为字符串或二进制。 3. **消息队列** - Kafka/RabbitMQ 的消息体通常为序列化后的数据。 --- **总结**:序列化是对象字节流间的桥梁,解决数据存储、传输和语言交互问题;反序列化则是重建对象的关键步骤。实际开发中需根据场景权衡格式选择、性能安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值