当前位置: 首页 > news >正文

Game Audio Programming

音频编程时游戏开发中最容易忽略,学习资源又是很少的环节。接下来,你将和我探索人耳的工作机制。

what is sound?
我们可以解释电视机是如何通过眼睛传递视觉信息的,但却往往无法对听觉信息做出类似的解释。

对声音的科学研究被称为声学,美国国家标准学会将其定义为 "关于声音的科学,包括对声音的产生,传播和影响。生物和心理影响。大多数与人类相关的声音物理特性都可以通过声波方程模拟为弹性介质中的波。但也有一些有趣的例外情况,如长号和超音速飞机,这两种飞机对空气的压缩足以产生显著的非线性。
 

与所有波现象一样,声音可以通过衍射、干涉、反射和折射等方式相互作用。考虑到声速(约 340 米/秒)和人类能听到的频率(稍后详述),墙壁、椅子和杯子等日常物品都能产生所有这些相互作用。这些相互作用的数量和复杂性使得精确模拟音频传输比模拟人类感知频率的光更为困难。


全面解释物理声学远远超出了本章的范围。 但我将为有兴趣了解更多信息的读者提供一段历史和参考资料。

对声音物理学的最早书面探索可以追溯到希腊人。毕达哥拉斯和亚里士多德都花了大量时间从物理和音乐的角度研究和撰写有关振动弦性质的文章。文艺复兴为我们对声音物理学的理解带来了许多进步。物理声学的现代参考书目有《物理声学基础》和《理论声学》。

直到十九世纪,亥姆霍兹等人的著作《论音调感觉作为音乐理论的生理基础》才出版了第一部将声音作为一种生理和心理现象进行研究的详尽著作。二十世纪,人们对耳朵的功能和大脑对声音的感知有了极大的了解。这一研究领域被称为心理声学,它直接造就了现代科技的奇迹,如 mpeg 音频压缩和当今令人惊叹的助听器。

声学中最重要的一个概念就是频率。频率的定义是重复现象在一定周期内重复的次数;在音频中,频率的单位是赫兹,用来衡量每秒的重复次数。频率之所以特别有用,是因为任何带限信号都可以通过傅立叶变换分解为一定数量的纯音(正弦波)。在分析或修改信号时,将信号视为可线性分离的简单部分的有限总和,而不是复杂的整体,是非常有用的。您的听觉也是这样认为的:耳朵最重要的行为就是分离频率。

How Do We Hear Audio?

声音无处不在。无论我们走到哪里,都会被振动的空气所包围。这些声波与我们的头部和耳廓(耳朵从头部伸出的部分)相互作用,并被导入耳道。在耳道中,电波会使鼓膜(一层薄薄的膜)产生与空气压力成比例的位移。这层膜将压力振动传导到一组骨骼,这些骨骼就像杠杆一样将振动传递并放大到耳蜗。

耳蜗是一个复杂的器官,是一个自适应降噪压频探测器。它的外形是一个卷起的圆锥体,内部的毛细胞沿长度方向排列。耳蜗的尺寸就像一种滤波器,在锥体上的每一点都有不同的频率响应。这种频率响应差异导致耳蜗长度方向上每一点的振动都不同(音调映射)。沿着耳蜗长度方向存在着成千上万个毛细胞,它们通过将振动传导到毛囊来充当信号检测器,从而将物理振动转换成神经系统中的电脉冲。这些信号在耳蜗和大脑中经过处理,形成我们对声音的感知。图  显示了人耳各部分的示意图。

                



《听觉心理学导论》是一本关于这一主题的极好的入门参考书,它以更深的深度涵盖了本节中介绍的大部分内容。我认为,无论是否从事音频技术工作,这本书都是必读书。更深入的书籍是同名的《心理声学》。
 

Dynamic Range
 

我们的听力有一个惊人的事实,那就是耳朵的动态范围。人类听力的范围约为 120 分贝(dB)。分贝是一个对数单位,用来表示两个数值的比值。当用于测量声压级时,比率中的参考电平是人类能听到的最安静的声音。耳朵实现这一目标的主要方式是通过骨头将信号从鼓膜传输到耳蜗。它们能够动态地重新配置,根据传入的信号实时调整增益。

Spatial Hearing(空间听力)


人类能够辨别声音的方向,主要是由于头部和耳朵的几何形状。大脑用于辨别方向的两个物理线索是耳际时差(ITD)和头部相关传递函数(HRTF)。

声音的移动速度很慢,以至于你的大脑可以测量出声音波到达一侧耳朵与到达另一侧耳朵之间的时间延迟。 声音波到达一侧耳朵与到达另一侧耳朵之间的时间差。这个时间差称为 ITD。如果声音在人的正前方,延迟时间为零,因为声波会同时击中两只耳朵。当声音向一侧移动时,这一延迟会随着声音到两耳距离的变化而变化。这是大脑对声音相对于头部前方的角度的主要提示。

头部和耳廓的结构就像一个滤波器,可根据信号的角度改变频率响应。例如,如果声音通过耳廓传播,高频率的功率就会减弱。我们可以通过为每只耳朵定义一个滤波器来模拟这些效果,该滤波器的频率响应因声音与耳朵的入射角度不同而不同。这种基于角度的滤波器就是 HRTF。大脑通过分析信号的频率响应来推断方向信息。这是一种学习行为,因为每个人耳朵的具体形状会影响 HRTF,因此不同个体的 HRTF 会有很大差异。

提供给大脑的信息不足以让大脑分辨出所有传入声音的角度。这种模糊性形成了一个锥形,被恰当地称为 "混淆锥"。大脑会利用其他感官的输入(例如,将声源与视觉输入相匹配)和上下文知识(例如,直升机很少在人的脚下)来帮助缩小声音的实际方向。

《 Spatial Hearing 》一书对此进行了详尽的评述。

Reflections

我们周围的环境主要通过反射与我们的声音环境相互作用。当声波与表面相互作用时,表面会反射声波。在频率较高、表面光滑的情况下,反射的原理与镜面反射很相似。反射包含大量有关周围环境的信息。反射的结构是大脑了解听者与声音之间距离的主要线索。它还能让我们估计周围环境的大小。

反射还会干扰更重要的信号,因此耳朵会忽略某些反射。当一个声音后面紧跟着另一个声音时,大脑只会使用第一个声音来判断声音的方向。这就是所谓的 "优先效应"。
 

Time and Sensory Fusion (时间与感官的融合)


人类对时间的感知是非直觉性的。例如,有文献记载,一个刺激会改变对先前接收到的刺激的感知,这显然违反了我们的因果关系概念。在所谓的 "感觉融合 "方面,已经进行了大量有趣且与游戏极其相关的研究。这是一项关于两个刺激需要接近到什么程度,大脑才会认为它们是同一物理原因的一部分的研究。例如,两个音频脉冲的距离有多近,大脑仍能将它们区分为不同的声音(约 5 毫秒);声音与某人说话的视频在时间上的距离有多远,听者才会不再将声音和音频视为一体(唇音同步)。这个特殊的例子显示了心理声学中常见的复杂性,因为唇音同步的时间并不对称。如果音频领先于视觉,而不是相反,您就会发现同步偏离的时间间隔要短得多。不同人群的灌注感差异很大,最准确和最不准确的人之间可能相差五倍之多。音乐家和其他受过正规音频训练的人往往比普通人的阈值低得多。我过于简化的唇音同步经验法则是将音频保持在视频的 50 毫秒以内。音频轶事》中 "可感知的听觉延迟 "一章: 数字音频的工具、技巧和技术》11 中的 "可感知的听觉延迟 "一章对与感觉融合有关的研究进行了出色的概述,任何从事交互式音频工作的人都应该熟悉这些研究。

Frequency

听觉的第一近似值是窗口时间频率转换器。窗口式的意思是它只关注一小部分时间。耳朵可以精确地检测到大约 20 赫兹到最多 20 千赫兹的频率。间距类似于指数,因此耳朵的精确度(以赫兹为单位)会随着音调的增加而降低。为了更接近耳朵的音高空间,人们开发了许多单位,如 Mel、Bark 和 ERB。
 

Masking


我们听觉最引人注目的能力之一,就是能够根据同一信号的时频内容过滤掉信号中的频率内容。概括地说,就是响亮的声音会让较安静的声音听不见。具体细节相当复杂,超出了本文的讨论范围。掩蔽模型是有损音频压缩算法(如 mpeg)用来减少存储音频信息量的方法,因为耳朵会移除的任何信号都无需保留在压缩音频中。

为了说明这种复杂性的特点,我将举两个掩蔽行为的例子。首先,较小的宽带声音可以掩盖较大的纯音声音(频率掩蔽)。这在游戏中很常见,因为枪声和爆炸声是非常常见的声音。这些声音的频带极宽,这意味着它们在几乎所有可感知的频率上都有威力。正因为如此,它们能非常有效地掩盖局部频率较高的声音。根据我的经验,一种几乎听不见的宽带声音(通常是爆炸声)会导致其他各种声音变得听不见,这种情况很常见。仅仅移除大的爆炸噪音就会使其他声音变得嘈杂,而且由于其他声音不再被掩盖,往往会使整个场景显得更加响亮。

另一个例子是,一个声音在另一个声音之后出现,会导致在时间上先出现的声音听不见(时间掩蔽)。在 100 毫秒左右的感知中,因果关系是一个模糊的量。
 

HOW IS AUDIO REPRESENTED,PROCESSED, AND REPRODUCED?(音频是如何表现、处理和再现的?)


一维物理属性可以用来表示某一时刻的空气压力。如果该属性随时间变化,它可以表示音频。常见的例子包括电压(最常见的模拟信号)、电流(动态麦克风)、光透射率(胶片)、磁定向(磁带)和物理位移(唱片)。所选的属性随时间变化以表示随时间变化的压力。在存储介质中,时间通常用长度来表示(磁带、光学、唱片)。在许多声音模拟中,时间是由时间本身来表示的(例如,通过电缆的电压)。

大部分源音频都是通过麦克风录制的物理声音。麦克风将气压转化为其中一种压力模拟信号(电压和电流是最常见的两种)。扬声器将电流或电压(几乎总是电流)转换为气压。

在游戏中(以及在所有数字音频处理中),处理声音的通用表示法是脉冲编码调制,或称 PCM。这种表示法由一串整数组成,以等间隔的时间表示声压。

与所有近似方法一样,数字表示法并不完美。由于我们是用固定大小的整数来捕捉连续量,因此量化会造成信息损失。用于表示压力的整数的比特大小称为(bit depth)比特深度。最常用的位深度是 16 位。以固定速率采样也会造成信息损失,但具体情况难以量化。

尼奎斯特-香农采样定理是了解采样如何影响信号的最有力工具之一。这一理论略显简单,它指出,对于带限信号,需要以其最高频率的两倍以上的速率进行采样,才能正确重建信号。奈奎斯特以上的高频成分会反射到采样信号带宽内的频率上,这种现象被称为混叠。从音频角度来看,混叠听起来很不自然,一般应避免。 许多书籍中都有这方面的内容。我最喜欢的一本书是《 数字信号处理的理论与应用》。

几乎所有音频数字信号处理 (DSP) 都是通过对这些整数序列进行基本运算(+、-、∗)来完成的。这也是一个涵盖广泛的巨大课题。我强烈推荐 Julius O. Smith III 的音频 DSP 系列丛书,这套书既有在线版,也有印刷版。
 

CONCLUSION

听觉是一种复杂的感觉,有时并不直观。要想在视频游戏音频技术和艺术上取得成功,就必须了解其特殊性。要掌握与游戏编程相关的音频知识,需要具备物理学、心理学和信号处理等领域的大量知识。
 

1. American Standards Association. 1960. Acoustical terminology SI, 1–1960.New York: American Standards Association.

2. Blackstock, David T. 2000. Fundamentals of Physical Acoustics. New York: John Wiley & Sons.

3. Morse, Philip McCord, and K. Uno Ingard. 1968. Theoretical Acoustics.Princeton: Princeton University Press.

4. Helmholtz, Hermann L.F., and Alexander J. Ellis. 2009. On the Sensations of Tone as a Physiological Basis for the Theory of Music. Cambridge: Cambridge University Press.

5. Smith, Julius O. 2007. Mathematics of the Discrete Fourier Transform (DFT): With Audio Applications. W3K.

6. Brockmann, Chittka L. A diagram of the anatomy of the human ear. https://commons.wikimedia.org/wiki/File:Anatomy_of_the_Human_Ear_en.svg licensed under Creative Commons Attribution 2.5 Generic license.

7. Moore, Brian C.J. 2012. An Introduction to the Psychology of Hearing. Leiden,The Netherlands: Brill.

相关文章:

Game Audio Programming

音频编程时游戏开发中最容易忽略,学习资源又是很少的环节。接下来,你将和我探索人耳的工作机制。 what is sound? 我们可以解释电视机是如何通过眼睛传递视觉信息的,但却往往无法对听觉信息做出类似的解释。 对声音的科学研究被称为声学&…...

高风险IP来自哪里:探讨IP地址来源及其风险性质

在网络安全领域,高风险IP地址是指那些可能涉及恶意活动或网络攻击的IP地址。了解这些高风险IP地址的来源可以帮助网络管理员更好地识别和应对潜在的安全威胁。本文将探讨高风险IP地址的来源及其风险性质,并提供一些有效的应对措施。 风险IP查询&#xf…...

【每日跟读】常用英语500句(300~400)

【每日跟读】常用英语500句 I had to take a shower. 我洗了个澡 Go on in. 赶紧进去吧 Hold up. 等一下 They seem like nice people. 他们看起来像好人 Such a wonderful age. 如此美好的年纪 That’s very impressive. 真厉害 I can see that. 看得出来 You should …...

设计模式(7):装饰器模式

一.装饰器模式职责: 动态的为一个对象增加新的功能;装饰器是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能,使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。 …...

Flink SQL填坑记3:两个kafka数据关联查询

在一个项目中,实时生成的统计数据需要关联另外一张表(并非维表),需要统计的数据表是Kafka数据,而需要关联的表,由于不是维度,不能按照主键查询,所以如果放在MySQL上,将存在严重的性能问题,这个时候我想到用将两张表的数据都生成为Kafka数据,然后进行Join操作。中途发…...

移动平台实时动态多点光源方案:Cluster Light

一、什么是 Cluster Light,它具体如何实现多点光源效果? 对于移动设备,如何支持场景中大量的实时点光源一直以来都是比较棘手的问题,因此对于过去,往往有如下两种常规方案: 静态点光源直接烘焙&#xff0…...

2024年03月CCF-GESP编程能力等级认证C++编程八级真题解析

本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 为丰富食堂菜谱,炒菜部进行头脑风暴。肉类有鸡肉、牛肉、羊肉、猪肉4种,切法有肉排、肉块、肉末3种,配菜有圆白菜、油菜、…...

(十一)图像的罗伯特梯度锐化

环境:Windows10专业版 IDEA2021.2.3 jdk11.0.1 OpenCV-460.jar 系列文章: (一)PythonGDAL实现BSQ,BIP,BIL格式的相互转换 (二)BSQ,BIL,BIP存储格式的相互转换算法 (三…...

实验九 枚举问题(运算模拟)

实验名称:实验九 枚举问题(运算模拟) 实验目的:熟练掌握一些枚举问题的处理方法。 实验内容: 问题描述:(乘积为n个1的数字游戏)两位计算机爱好者在进行“积为n个1的数字游戏”&a…...

2024 年 AI 辅助研发趋势:从研发数字化到 AI + 开发工具 2.0,不止于 Copilot

1. 背景介绍 随着人工智能技术的飞速发展,AI在软件开发领域的应用越来越广泛。从最初的代码补全、错误提示,到现在的代码生成、自动化测试,AI正在逐步改变软件开发的模式。2024年,AI辅助研发的趋势已经从研发数字化向AI开发工具2…...

UE5数字孪生系列笔记(三)

C创建Pawn类玩家 创建一个GameMode蓝图用来加载我们自定义的游戏Mode新建一个Pawn的C,MyCharacter类作为玩家,新建一个相机组件与相机臂组件,box组件作为根组件 // Fill out your copyright notice in the Description page of Project Set…...

ASR-LLM-TTS 大模型对话实现案例;语音识别、大模型对话、声音生成

参考:https://blog.csdn.net/weixin_42357472/article/details/136305123(llm+tts) https://blog.csdn.net/weixin_42357472/article/details/136411769 (asr+vad) 这里LLM用的是chatglm;电脑声音播报用的playsound 1、实时语音识别版本 注意:暂时这项目有个缺陷就是tts…...

主干网络篇 | YOLOv8更换主干网络之EfficientNet

前言:Hello大家好,我是小哥谈。EfficientNet是一种高效的卷积神经网络架构,由Mingxing Tan和Quoc V. Le在2019年提出,其设计思想是在不增加计算复杂度的情况下提高模型的准确性。它引入了一个称为"复合系数"的概念,该系数用于同时缩放网络的深度、宽度和分辨率。…...

Web开发-Django学习笔记

客户端如何获取服务端的数据信息? 通常 是 HTTP网络协议,通过网络传输数据信息。 客户端通过HTTP协议发送请求信息给服务端,并从服务端接收响应信息。 Web 前端开发: (HTML、CSS、JS)文件部署在后端服务…...

关于深度学习的 PyTorch 项目如何上手分析?从什么地方切入?

文章目录 PyTorch 项目分析1.背景2.分析流程 PyTorch 项目分析 1.背景 当我们拿到一个 PyTorch 的深度学习项目时,应该怎么入手?怎么去查看代码? 2.分析流程 首先阅读对应项目的 README.md 文件。通过阅读 README.md ,一般可以…...

JavaEE企业开发新技术4

2.16 模拟Spring IOC容器功能-1 2.17 模拟Spring IOC容器功能-2 什么是IOC? 控制反转,把对象创建和对象之间的调用过程交给Spring框架进行管理使用IOC的目的:为了耦合度降低 解释: 模仿 IOC容器的功能,我们利用 Map…...

CSS使用JS变量

1. CSS变量 CSS 变量(也称为自定义属性)允许我们在 CSS 中定义可重复使用的值,并将其应用于不同的选择器。为了创建一个 CSS 变量,我们需要使用 -- 前缀,然后可以像常规属性一样使用它。 :root {--primary-color: bl…...

拆分巨石:将MVPS和MVAS应用于遗留应用程序——可持续架构(六)

前言 MVP 和 MVA 的概念不仅适用于新应用程序;它们提供了一种新颖的方式来审视对遗留系统的范围变更,以防止过快地承担过多的变化 - 参见图1。MVA 可以帮助组织评估和更新其技术标准,通过展示新技术如何真正对支持 MVP 至关重要。创建 MVA 可…...

Linux renice命令教程:如何优雅地调整进程优先级(附案例详解和注意事项)

Linux renice命令介绍 renice命令在Linux中用于修改已经运行的进程的优先级。这个命令允许你改变一个已经运行的进程的调度优先级。如果我们给一个进程设置了更高的优先级,那么内核将为该进程分配更多的CPU时间。 Linux renice命令适用的Linux版本 renice命令在所…...

Gitea 的详细介绍

什么是 Gitea? Gitea 是一个开源、轻量级的自托管 Git 服务,它允许用户搭建类似于 GitHub 或 GitLab 的代码托管平台。由于采用 Go 语言开发,Gitea 具有高效的性能和跨平台特性,适合个人开发者或小团队使用。 Gitea 的特点 轻量…...

Kotlin object

object 的三种用法 Kotlin 的 object 关键字有三种用法: 对象声明 ,一般用来实现单例伴生对象 ,类似 Java 的 static 关键字,也可以用于工厂方法模式对象表达式 ,一般用来代替 Java 的匿名内部类 对象声明 object 的语义是这样的: 定义一个类并创建一个实例 。不管是对象…...

【Redis】数据类型、事务执行、内存淘汰策略

目录 数据类型 Redis事务执行步骤 步骤: redis内存淘汰策略 设置内存淘汰策略 1.设置配置文件 2.通过命令设置 数据类型 官网解释 Understand Redis data types | Redis 首先,Redis 的所有键都是字符串,常用的数据类型有 5 种:Strin…...

Python Flask Web框架初步入门

前言 flask基础 搭建flask服务器 定义html 使用templates模板定义页面的html html页面编写 render_template传参变量 定义图片 创建static目录,存入图片 html编写 flask入门 网站多域名 网站之间超链接跳转 入门案例 将centos的rpm包下载链接集成到自…...

【设计模式】工厂方法模式详解

在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则。如果我们…...

独立游戏《星尘异变》UE5 C++程序开发日志3——UEC++特供的数据类型

本篇日志将介绍FString,FText、FName的用法和相互转换,以及容器TMap,TArray的增删查改 一、字符串相关数据类型:FString、FText、FName FString是最接近std::string的类型,字符串本身可以看做一个存储char型的动态数…...

递归方法的理解

递归方法调用 :方法自己调用自己的现象就称为递归。 递归的分类 : 直接递归、间接递归。 直接递归:方法自身调用自己 public void methodA (){ methodA (); } 间接递归:可以理解为A()方法调用B()方法,B()方法调用C()方法&am…...

css之flex布局文本不换行不显示省略号的解决方法

文章目录 一、单行长文本显示省略号二、flex布局下的处理技巧 一、单行长文本显示省略号 先讲讲常规情况下长文本不跨行显示省略号的代码: overflow: hidden; //不允许内容超出盒子 white-space: nowrap; //不允许文本跨行 text-overflow: ellipsis; //文本超…...

华清远见STM32U5开发板助力2024嵌入式大赛ST赛道智能可穿戴设备及IOT选题项目开发

第七届(2024)全国大学生嵌入式芯片与系统设计竞赛(以下简称“大赛”)已经拉开帷幕,大赛的报名热潮正席卷而来,高校电子电气类相关专业(电子、信息、计算机、自动化、电气、仪科等)全…...

若依框架实现不同端用户登录(后台管理用户和前台会员登录——sping security多用户)

目录 需求背景 前期准备 实现UserDetailsService接口 改造loginUser 声明自定义AuthenticationManager 的bean 自定义登录接口 参考文章 效果如下 需求背景 用若依搭建的后台管理环境,但是前台用户系统(前端)并没有和若依的前端集成在一起。…...

【解決|三方工具】Obi Rope 编辑器运行即崩溃问题

开发平台:Unity 2021.3.7 三方工具:Unity资产工具 - Obi Rope   问题背景 使用Unity三方开发工具 - Obi Rope 模拟绳索效果。配置后运行 Unity 出现报错并崩溃。通过崩溃日志反馈得到如下图所示 这是一个序列化问题造成的崩溃,指向性为 Obi…...

惠阳开发网站建设/全媒体广告投放平台

点击上方"蓝字"关注我们,享更多干货!索引分裂(Index Block Split),就是索引块的分裂。当一次DML操作修改了索引块上的数据,但是旧有的索引块没有足够的空间去容纳新修改的数据时,将分…...

网站后台可改资料/网络营销的理解

【LOJ#3146】[APIO2019]路灯(树套树) 题面 LOJ 题解 考场上因为\(\text{bridge}\)某个\(\text{subtask}\)没有判\(n1\)的情况导致我卡了\(3.5h\)左右,然后这题就只能匆匆\(rush\)了一个\(60\)分暴力...... 考虑维护出每一个时刻的亮的灯的连续…...

商丘网站建设流程/yahoo引擎入口

美国当地时间五月26日,微软已经在MSDN上放出VS2010简体中文版供订阅用户下载。相关信息如下: Visual Studio 2010 Ultimate (x86) - DVD (Chinese-Simplified) 文件名 cn_visual_studio_2010_ultimate_x86_dvd_532347.iso 发布日期 (UTC): 5/26/2010 3:…...

wordpress顶踩仿织梦/在线搜索资源

思路1&#xff1a;使用回溯法&#xff0c;同时剪掉不合理分支 // 产生不同的括号队列&#xff0c;选用回溯法 class Solution { public:vector<string> res;vector<string> generateParenthesis(int n) {string str "";backtrack(0,0,n,str);return re…...

删除网站留言板功能/app优化推广

变量是保存存储值的内存位置。也就是说&#xff0c;当创建一个变量时&#xff0c;可以在内存中保留一些空间。 基于变量的数据类型&#xff0c;解释器分配内存并决定可以存储在保留的存储器中的内容。 因此&#xff0c;通过为变量分配不同的数据类型&#xff0c;可以在这些变量…...

坪山网站开发/推广网站的四种方法

转自&#xff1a;https://blog.csdn.net/calledWWW/article/details/79307706 阅读&#xff1a;https://blog.csdn.net/wdehxiang/article/details/77872506 一、什么是序列化和反序列化 序列化&#xff08;Serialization&#xff09;是一种将对象转化为字节序列的过程&#…...