【IO流系列】ObjectStream 序列化流与反序列化流

序列化流与反序列化流

    • 1. 概述
    • 2. 作用
    • 3. 序列化流(对象操作字节输出流)
      • 3.1 构造方法
      • 3.2 成员方法
      • 3.3 代码示例
    • 4. 反序列化流(对象操作字节输入流)
      • 4.1 构造方法
      • 4.2 成员方法
      • 4.3 代码示例
    • 5. 细节
    • 6. 练习
      • 6.1 练习1:用对象流读写多个对象
    • 7. 注意事项

文章中的部分照片来源于哔站黑马程序员阿伟老师处,仅用学习,无商用,侵权联系删除!

1. 概述

Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据对象的类型对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。

反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化对象的数据对象的类型对象中存储的数据信息,都可以用来在内存中创建对象。看图理解序列化:


主要的序列化流和反序列化流有以下两种:

  1. ObjectOutputStream(序列化流)ObjectOutputStream 是用于将 Java 对象序列化为字节流的类。通过将对象写入 ObjectOutputStream,对象会被转换为字节序列,并可以保存到文件、网络等介质中。

  2. ObjectInputStream(反序列化流)ObjectInputStream 是用于从字节流中反序列化对象的类。通过读取 ObjectInputStream 中的字节序列,可以将字节数据还原为原始的 Java 对象。

在这里插入图片描述

2. 作用

  1. 对象持久化存储:序列化流可以将 Java 对象转换为字节序列并保存到文件或数据库中,实现对象的持久化存储。这样可以在程序关闭后将对象数据保存在持久化介质中,下次程序运行时可以重新读取数据并还原为对象。

  2. 网络传输:通过序列化流,可以将对象转换为字节序列进行网络传输。在客户端和服务器之间传递对象数据时,可以使用序列化流将对象进行序列化后发送,接收方通过反序列化流还原对象。

  3. 跨平台数据交换:序列化流和反序列化流可以实现不同平台、不同语言之间对象数据的交换。在跨平台开发或不同系统之间数据传递时,可以使用序列化流将对象序列化为字节序列,从而实现数据的跨平台兼容性。

  4. 缓存对象:通过序列化流可以将对象存储在缓存中,提高程序性能。对象序列化后可以保存在内存或硬盘上,下次需要时直接反序列化而不用重新创建对象,节省了对象的创建时间。

3. 序列化流(对象操作字节输出流)

序列化流 /对象操作输出流:可以把Java中的对象写到本地文件中

3.1 构造方法

构造方法说明
public ObjectOutputStream(OutputStream out)把基本流包装成高级流
  • 构造方法:public ObjectOutputStream(OutputStream out)
    • 说明:将提供的 OutputStream 参数 out 包装成 ObjectOutputStream,使得可以使用 ObjectOutputStream 来将对象序列化并写入到这个输出流中。

3.2 成员方法

成员方法说明
public final void writeObject(Object obj)把对象序列化(写出)到文件中去
  • 方法:public final void writeObject(Object obj)
  • 说明:将传入的对象 obj 进行序列化,并将序列化后的数据写出到文件中。

3.3 代码示例

  • 代码示例
    • 测试类
    package text.IOStream.ObjectStream.ObjectStream01;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    
    /*序列化流/对象操作输出流
    
    序列化流 /对象操作输出流:可以把lava中的对象写到本地文件中
    
    | 构造方法                                    | 说明                 |
    | ------------------------------------------- | -------------------- |
    | public ObjectOutputStream(OutputStream out) | 把基本流包装成高级流 |
    
    | 成员方法                                  | 说明                         |
    | ----------------------------------------- | ---------------------------- |
    | public final void writeObject(Object obj) | 把对象序列化(写出)到文件中去 |
    
    细节1:
        使用对象输出流将对象保存到文件时会出现NotSerializableException异常
    解决方案:需要让Javabean类实现Serializable接口
          Serializable接口里面是没有抽象方法,是个标记型接口
          一旦实现了这个接口,那么就表示当前的Student类可以被序列化
    细节2:
        序列化之后,修改Javabean类,再次反序列化,会出问题,会抛出InvalidClassException异常
        解决方案:给JavaBean类添加serialVersionUID的(序列号、版本号)
        添加序列号,java底层会在实现Serializable接口的类中生成个序列号,在输入文件时,也包含序列号
        当修改了实现Serializable接口的类时,序列号也会更改,当输入文件的序列号与原来实现Serializable接口的类的序列号不一致时就会报错,因此我们需要手动给实现Serializable接口的类设置序列号
    
    细节3:
        如果一个对象中的某个成员变量的值不想被序列化,可以给该成员日安家transient关键字修饰
        transient:瞬态关键字
        作用:不会把当前的属性序列化到本地文件中
    
    细节4:
        序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了。
    
    需求:
        利用序列化流/对象操作输出流,把一个对象写到本地文件中
     */
    public class ObjectStream01 {
        public static void main(String[] args) throws IOException {
            //创建学生对象
            Student stu = new Student("张三", 23, "南京");
            //创建序列化流(对象操作输出流)
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\ObjectStream\\ObjectStream01\\student"));
            //输出本地文件
            oos.writeObject(stu);
            //释放资源
            oos.close();
        }
    }
    
    
    • 标准的Javabean类
    package text.IOStream.ObjectStream.ObjectStream01;
    
    import java.io.Serial;
    import java.io.Serializable;
    
    //Serializable接口里面是没有抽象方法,是个标记型接口
    //一旦实现了这个接口,那么就表示当前的student类可以被序列化
    public class Student implements Serializable {
        //添加序列号,java底层会在实现Serializable接口的类中生成个序列号,在输入文件时,也包含序列号
        //当修改了实现Serializable接口的类时,序列号也会更改,当输入文件的序列号与原来实现Serializable接口的类的序列号不一致时就会报错,因此我们需要手动给实现Serializable接口的类设置序列号
        @Serial
        private static final long serialVersionUID = -5718005322642298180L;
    
    
        private String name;
        private int age;
        //transient:瞬态关键字
        //作用:不会把当前的属性序列化到本地文件中
        private transient String address;
    
    
        public Student() {
        }
    
        public Student(String name, int age, String address) {
            this.name = name;
            this.age = age;
            this.address = address;
        }
    
        /**
         * 获取
         *
         * @return name
         */
        public String getName() {
            return name;
        }
    
        /**
         * 设置
         *
         * @param name
         */
        public void setName(String name) {
            this.name = name;
        }
    
        /**
         * 获取
         *
         * @return age
         */
        public int getAge() {
            return age;
        }
    
        /**
         * 设置
         *
         * @param age
         */
        public void setAge(int age) {
            this.age = age;
        }
    
        /**
         * 获取
         *
         * @return address
         */
        public String getAddress() {
            return address;
        }
    
        /**
         * 设置
         *
         * @param address
         */
        public void setAddress(String address) {
            this.address = address;
        }
    
        public String toString() {
            return "Student{ name = " + name + ", age = " + age + ", address = " + address + "}";
        }
    }
    
    
  • 输出结果
    • student文件
      在这里插入图片描述

4. 反序列化流(对象操作字节输入流)

反序列化流 /对象操作输入流:把序列化到本地文件中的对象,读取到程序中来

4.1 构造方法

构造方法说明
public ObjectInputStream(InputStream out)把基本流变成高级流
  • 构造方法:public ObjectInputStream(InputStream in)
  • 说明:ObjectInputStream 是一个对象输入流,用于从输入流 in 中读取序列化的对象数据。

4.2 成员方法

成员方法说明
public Object readObject()可以把序列化到本地文件中的对象,读取到程序中来
  • 方法:public Object readObject()
  • 说明:readObject() 方法用于从对象输入流中读取序列化的对象数据,并将其还原为原始的对象。该方法会尝试将读取的数据转换为 Object 类型,并需要进行类型转换为实际的对象类型。

4.3 代码示例

  • 代码示例
  • 需求:利用反序列化流/对象操作输入流,把文件中中的对象读到程序当中
    • 测试类
      package text.IOStream.ObjectStream.ObjectStream02;
      
      import java.io.FileInputStream;
      import java.io.IOException;
      import java.io.ObjectInputStream;
      
      /*反序列化流 /对象操作输入流
      
      反序列化流 /对象操作输入流:把序列化到本地文件中的对象,读取到程序中来
      
      | 构造方法                                  | 说明               |
      | ----------------------------------------- | ------------------ |
      | public ObjectInputStream(InputStream out) | 把基本流变成高级流 |
      
      | 成员方法                    | 说明                                           |
      | --------------------------- | ---------------------------------------------- |
      | public Object readObject () | 可以把序列化到本地文件中的对象,读取到程序中来 |
      
      细节1:
          使用对象输出流将对象保存到文件时会出现NotSerializableException异常
      解决方案:需要让Javabean类实现Serializable接口
            Serializable接口里面是没有抽象方法,是个标记型接口
            一旦实现了这个接口,那么就表示当前的Student类可以被序列化
      细节2:
          序列化之后,修改Javabean类,再次反序列化,会出问题,会抛出InvalidClassException异常
          解决方案:给JavaBean类添加serialVersionUID的(序列号、版本号)
          添加序列号,java底层会在实现Serializable接口的类中生成个序列号,在输入文件时,也包含序列号
          当修改了实现Serializable接口的类时,序列号也会更改,当输入文件的序列号与原来实现Serializable接口的类的序列号不一致时就会报错,因此我们需要手动给实现Serializable接口的类设置序列号
      
      细节3:
          如果一个对象中的某个成员变量的值不想被序列化,可以给该成员日安家transient关键字修饰
          transient:瞬态关键字
          作用:不会把当前的属性序列化到本地文件中
      
      细节4:
          序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了。
             
      需求:利用反序列化流/对象操作输入流,把文件中中的对象读到程序当中
       */
      public class ObjectStream02 {
          public static void main(String[] args) throws IOException, ClassNotFoundException {
              //创建反序列化流(对象操作输入流)
              ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\ObjectStream\\ObjectStream01\\student"));
              //输入数据
              Object student = ois.readObject();
              //打印学生对象
              System.out.println(student);
              //释放资源
              ois.close();
          }
      }
      
      
  • 输出结果
    在这里插入图片描述

5. 细节

  • 细节1: 使用对象输出流将对象保存到文件时会出现NotSerializableException异常

    • 解决方案:需要让Javabean类实现Serializable接口

      • Serializable接口里面是没有抽象方法,是个标记型接口

      • 一旦实现了这个接口,那么就表示当前的Student类可以被序列化

  • 细节2: 序列化之后,修改Javabean类,再次反序列化,会出问题,会抛出InvalidClassException异常

    • 解决方案:给JavaBean类添加serialVersionUID的(序列号、版本号)

      • 添加序列号,java底层会在实现Serializable接口的类中生成个序列号,在输入文件时,也包含序列号

      • 当修改了实现Serializable接口的类时,序列号也会更改,当输入文件的序列号与原来实现Serializable接口的类的序列号不一致时就会报错,因此我们需要手动给实现Serializable接口的类设置序列号

  • 细节3: 如果一个对象中的某个成员变量的值不想被序列化,可以给该成员日安家transient关键字修饰

    • transient:瞬态关键字

      • 作用:不会把当前的属性序列化到本地文件中
  • 细节4:序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了。

6. 练习

6.1 练习1:用对象流读写多个对象

  • 需求

    将多个自定义对象序列化到文件中,但是由于对象的个数不确定,反序列化该如何读取呢?

  • 代码示例

    • 序列化流(对象操作输出流)
    package text.IOStream.ObjectStream.ObjectStream03;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.util.ArrayList;
    
    /*用对象流读写多个对象
    需求:
        将多个自定义对象序列化到文件中,但是由于对象的个数不确定,反序列化该如何读取呢?
    
     */
    public class ObjectStream03 {
        public static void main(String[] args) throws IOException {
            //创建学生对象
            Student s1 = new Student("张三", 23, "天津");
            Student s2 = new Student("李四", 24, "南京");
            Student s3 = new Student("王五", 25, "北京");
            //创建集合,将学生对象添加进集合
            ArrayList<Student> list = new ArrayList<>();
            list.add(s1);
            list.add(s2);
            list.add(s3);
            //创建序列化流(对象操作输出流)
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\ObjectStream\\ObjectStream03\\a.txt"));
            //输出数据
            oos.writeObject(list);
            //释放资源
            oos.close();
        }
    }
    
    
    • 反序列化流(对象操作输入流)
    package text.IOStream.ObjectStream.ObjectStream03;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.util.ArrayList;
    
    //反序列流(对象操作输入流)
    public class ObjectInput {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            //创建反序列化流对象(对象操作输入流)
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\ObjectStream\\ObjectStream03\\a.txt"));
            //输入数据
            ArrayList<Student> list = (ArrayList<Student>) ois.readObject();
            //遍历list集合
            for (Student student : list) {
                System.out.println(student);
            }
            //释放资源
            ois.close();
        }
    }
    
    
    • 标准的Javabean类
    package text.IOStream.ObjectStream.ObjectStream03;
    
    import java.io.Serial;
    import java.io.Serializable;
    
    public class Student implements Serializable {
        @Serial
        private static final long serialVersionUID = -8803236034300730365L;
        private String name;
        private int age;
        private transient String address;
    
    
        public Student() {
        }
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public Student(String name, int age, String address) {
            this.name = name;
            this.age = age;
            this.address = address;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        /**
         * 获取
         *
         * @return name
         */
        public String getName() {
            return name;
        }
    
        /**
         * 设置
         *
         * @param name
         */
        public void setName(String name) {
            this.name = name;
        }
    
        /**
         * 获取
         *
         * @return age
         */
        public int getAge() {
            return age;
        }
    
        /**
         * 设置
         *
         * @param age
         */
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", address='" + address + '\'' +
                    '}';
        }
    }
    
    
  • 输出结果

    • a.txt
      在这里插入图片描述
    • 反序列化流(对象操作输入流)
      在这里插入图片描述

7. 注意事项

  1. 版本控制:对象在被序列化后,如果类发生了变化(例如字段新增、删除、修改),在反序列化时可能会出现不兼容的情况。为了避免这种问题,可以在类中使用序列化版本号来进行版本控制。

  2. transient关键字:在对象中使用 transient 关键字修饰的字段不会被序列化,这在某些情况下是很有用的,比如对于不需要序列化的敏感数据或临时计算结果。

  3. 对象引用:序列化后的对象图中可能包含重复的对象引用,这可能会导致数据的冗余性。在设计序列化对象时,可以考虑使用 writeObject() 和 readObject() 方法来处理对象引用,以减少序列化数据的冗余性。

  4. Serializable接口:要使一个类可以被序列化,需要实现 Serializable 接口。这个接口没有任何方法,只是用来标记类具有可序列化的能力。在进行序列化和反序列化时,确保类的所有字段都是可序列化的,否则可能会导致异常。

  5. 所有序列化类的父类必须是可序列化的:如果一个类实现了 Serializable 接口,那么它的所有父类都应该是可序列化的,否则可能会导致序列化异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/418590.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

看待事物的层与次 | DBA与架构的一次对话交流

前言 在计算机软件业生涯中,想必行内人或多或少都能感受到系统架构设计与数据库系统工程的重要性,也能够清晰地认识到在计算机软件行业中技术工程师这个职业所需要的专业素养和必备技能! 背景 通过自研的数据库监控管理工具,发现 SQL Server 数据库连接数在1-2K之间,想…

【git】入门

当我们设计文档时&#xff0c;我们会不断的修改文档&#xff0c;而设计的文档通过第一次修改&#xff0c;第二次修改&#xff0c;很难讲每次修改的版本维护起来&#xff0c;每个版本可以分为v1,v2 ,v3,v4如果需要哪个版本&#xff0c;我们可以直接查看。 随着版本的不断增多&am…

当大语言模型遇到AI绘画-google gemma与stable diffusion webui融合方法-矿卡40hx的AI一体机

你有想过建一台主机&#xff0c;又能AI聊天又能AI绘画&#xff0c;还可以直接把聊天内容直接画出来的机器吗&#xff1f; 当Google最新的大语言模型Gemma碰到stable diffusion webui会怎么样&#xff1f; 首先我们安装stable diffusion webui(automatic1111开源项目&#xff…

群晖NAS配置WebDav结合内网穿透实现公网访问本地影视资源

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是&#xff1a;1 使用环境要求&#xff1a;2 配置webdav3 测试局域网使用potplayer访问webdav3 内网穿透&#xff0c;映射至公网4 使用固定地址在potplayer访问webdav ​ 国内流媒体平台的内…

贪心算法(算法竞赛、蓝桥杯)--修理牛棚

1、B站视频链接&#xff1a;A27 贪心算法 P1209 [USACO1.3] 修理牛棚_哔哩哔哩_bilibili 题目链接&#xff1a;[USACO1.3] 修理牛棚 Barn Repair - 洛谷 #include <bits/stdc.h> using namespace std; const int N205; int m,s,c,ans; int a[N];//牛的位置标号 int d[N…

opencv--使用直方图找谷底进行确定分割阈值

直方图原理就不说了&#xff0c;大家自行百度 直方图可以帮助分析图像中的灰度变化&#xff0c;进而帮助确定最优二值化的灰度阈值&#xff08;threshold level&#xff09;。如果物体与背景的灰度值对比明显&#xff0c;此时灰度直方图就会包含双峰&#xff08;bimodal histo…

【golang】25、图片操作

用 “github.com/fogleman/gg” 可以画线, 框 用 “github.com/disintegration/imaging” 可以变换颜色 一、渲染 1.1 框和字 import "github.com/fogleman/gg"func DrawRectangles(inPath string, cRects []ColorTextRect, fnImgNameChange FnImgNameChange) (st…

C# 获取类型 Type.GetType()

背景 C#是强类型语言&#xff0c;任何对象都有Type&#xff0c;有时候需要使用Type来进行反射、序列化、筛选等&#xff0c;获取Type有Type.GetType, typeof()&#xff0c;object.GetType() 等方法&#xff0c;本文重点介绍Type.GetType()。 系统类型/本程序集内的类型 对于系…

【k8s配置与存储--配置管理】

1、ConfigMap的配置 1.1 ConfigMap介绍 ConfigMap 是一种 API 对象&#xff0c;用来将非机密性的数据保存到键值对中。使用时&#xff0c; Pod 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。 ConfigMap 将你的环境配置信息和容器镜像解耦&#xff0c;便于应用配…

蓝牙耳机和笔记本电脑配对连接上了,播放设备里没有显示蓝牙耳机这个设备,选不了输出设备

环境&#xff1a; WIN10 杂牌蓝牙耳机6s 问题描述&#xff1a; 蓝牙耳机和笔记本电脑配对连接上了&#xff0c;播放设备里没有显示蓝牙耳机这个设备&#xff0c;选不了输出设备 解决方案&#xff1a; 1.打开设备和打印机&#xff0c;找到这个设备 2.选中这个设备&#…

Linux下gcc编译常用命令详解

在Linux环境下&#xff0c;使用gcc编译器进行源代码的编译是程序员日常工作的一部分。本篇将介绍一些常用的gcc编译命令&#xff0c;帮助开发者更好地理解和使用这些命令。 1. 基本编译命令 gcc工作流程&#xff1a; 编译单个源文件 gcc source.c -o output这个命令将sour…

java学习笔记-初级

一、变量 1.双标签 <!-- 外部js script 双标签 --><script srcmy.js></script> 在新文件my.js里面写&#xff1a; 2.字符串定义&#xff1a; //外单内双var str 我是一个"高富帅"的程序员;console.log(str);// 字符串转义字符 都是用 \ 开头 …

Jenkins自动化部署之流水线模式部署

文章目录 任务类型Pipeline流水线项目声明式的Pipeline脚本式Pipeline 示例脚本生成Tools配置示例 高级Pipeline Script from SCM 任务类型 在Jenkins中&#xff0c;有不同类型的任务&#xff08;项目&#xff09;适用于不同的构建需求。以下是一些常见的Jenkins任务类型&…

供应链投毒预警 | 恶意NPM包利用Windows反向shell后门攻击开发者

概述 本周&#xff08;2024年02月19号&#xff09;&#xff0c;悬镜供应链安全情报中心在NPM官方仓库&#xff08;https://npmjs.com&#xff09;中发现多起NPM组件包投毒事件。攻击者利用包名错误拼写方式 (typo-squatting)在NPM仓库中连续发布9个不同版本的恶意包&#xff0…

ubuntu20.04 ROS-Noetic 配置qtcreator的ROS环境

文章目录 1 安装qtcreator1.1 下载安装Qt1.2 配置命令启动qtcreator2 配置ROS2.1 直接安装qtcreator-ros2.2 在qtcreator上安装ros_qtc_plugin插件3 注意3.1 构建套件3.2 更新、删除qt4 参考链接1 安装qtcreator QT官网:Qt Downloads 下载包链接:qt5.12.12 Qt5.12.12默认qtc…

SpringBoot使用classfinal-maven-plugin插件加密Jar包

jar包加密 1、在启动类的pom.xml中加入classfinal-maven-plugin插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><…

官网万词霸屏推广+关键词排名优化源码系统 带完整的安装代码包以及搭建教程

随着搜索引擎算法的不断更新和市场竞争的加剧&#xff0c;传统的SEO方法已经难以满足企业对于快速、高效推广的需求。罗峰结合多年的互联网营销经验和最新的搜索引擎优化技术&#xff0c;给大家推荐一款集网站搭建、关键词优化、数据分析于一体的源码系统。 以下是部分代码示例…

Linux信号【产生-保存-处理】

目录 前言&#xff1a; 1、进程信号基本概念 1.1、什么是信号&#xff1f; 1.2、信号的作用 2、键盘键入 2.1、ctrlc 终止前台进程 2.1.1、signal 注册执行动作 3、系统调用 3.1、kill 函数 3.2、模拟实现 myKill 3.3、raise 函数 3.4、abort 函数 4、软件条件信号…

时间序列分析实战(十一):ECM误差修正模型

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

服务器数据恢复-服务器RAID5上层XFS文件系统分区数据恢复案例

服务器数据恢复环境&#xff1a; MD1200磁盘柜中的磁盘通过RAID卡创建了一组RAID5阵列&#xff0c;分配了一个LUN。在Linux操作系统层面对该LUN进行了分区&#xff0c;划分sdc1和sdc2两个分区&#xff0c;通过LVM扩容的方式将sdc1分区加入到了root_lv中&#xff1b;sdc2分区格式…