Java中对象的序列化方式克隆详解

yizhihongxing

Java中对象的序列化方式克隆详解

什么是对象的序列化?

在Java中,对象的序列化是指将Java对象转换为二进制流的过程。序列化可以将对象存储在文件或者在网络传输中进行传输,也可以通过反序列化将二进制流转换为Java对象。

Java中提供了java.io.Serializable接口,如果一个类实现了这个接口,则该类的对象可以被序列化。

Java中的序列化实现

Java中的序列化实现由系统提供,我们可以通过以下代码将一个Java对象序列化:

public static void serialize(Object obj, File file) throws IOException {
    try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file))) {
        oos.writeObject(obj);
    }
}

上面代码的serialize方法接收一个Java对象和一个文件路径作为参数,将该Java对象序列化并存储到指定路径下的文件中。

Java中的反序列化实现

Java中的反序列化实现也由系统提供,我们可以通过以下代码将一个二进制流反序列化为Java对象:

public static Object deserialize(File file) throws IOException, ClassNotFoundException {
    try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {
        return ois.readObject();
    }
}

上面代码的deserialize方法接收一个存储了Java对象序列化结果的文件路径,并将其反序列化为Java对象。

对象的克隆

当我们需要复制一个Java对象时,我们可以使用对象的序列化和反序列化实现对象的克隆。

下面是一个示例,使用对象的序列化和反序列化实现对象的克隆:

public static Object clone(Object obj) throws IOException, ClassNotFoundException {
    //将对象序列化到byte[]数组中
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    try (ObjectOutputStream oos = new ObjectOutputStream(bos)) {
        oos.writeObject(obj);
    }
    //将byte[]数组反序列化为对象
    ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
    try (ObjectInputStream ois = new ObjectInputStream(bis)) {
        return ois.readObject();
    }
}

示例1

下面是一个示例,将一个Java对象序列化并存储在文件中,然后再将文件中的二进制流反序列化为Java对象:

public static void main(String[] args) throws IOException, ClassNotFoundException {
    Person person = new Person("小明", 18);
    File file = new File("person.ser");
    //将对象序列化到文件中
    serialize(person, file);
    //将文件中的二进制流反序列化为Java对象
    Person clonePerson = (Person) deserialize(file);
    //打印克隆的对象
    System.out.println(clonePerson);
}

static class Person implements Serializable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

运行以上代码,输出结果为:

Person{name='小明', age=18}

示例2

下面是另一个示例,将一个Java对象序列化并存储在文件中,然后再通过对象的克隆实现对象的深度复制:

public static void main(String[] args) throws IOException, ClassNotFoundException {
    Address address = new Address("中国", "北京", "朝阳区");
    Person person = new Person("小明", 18, address);
    File file = new File("person.ser");
    //将对象序列化到文件中
    serialize(person, file);
    //深度复制
    Person clonePerson = (Person) clone(person);
    clonePerson.getAddress().setCity("上海");
    //打印克隆的对象和原对象的地址信息,验证是否实现了深度复制
    System.out.println(person.getAddress().getCity());
    System.out.println(clonePerson.getAddress().getCity());
}

static class Person implements Serializable {
    private String name;
    private int age;
    private Address address;

    public Person(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public Address getAddress() {
        return address;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address=" + address +
                '}';
    }
}

static class Address implements Serializable {
    private String country;
    private String city;
    private String district;

    public Address(String country, String city, String district) {
        this.country = country;
        this.city = city;
        this.district = district;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Override
    public String toString() {
        return "Address{" +
                "country='" + country + '\'' +
                ", city='" + city + '\'' +
                ", district='" + district + '\'' +
                '}';
    }
}

运行以上代码,输出结果为:

朝阳区
上海

从输出结果可以看到,对象的克隆实现了深度复制,克隆对象和原对象地址信息已经不同。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中对象的序列化方式克隆详解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • SpringMVC中请求参数的获取方式

    SpringMVC中请求参数的获取方式 在SpringMVC中,可以通过多种方式获取请求参数: 通过@RequestParam注解获取请求参数 @RequestParam注解常用于简单类型参数的绑定,例如String、int等。使用该注解时可以指定参数名称,如果请求中传递的参数名称与指定的参数名称不一致,则无法获取到参数值。 @GetMapping(&quo…

    Java 2023年6月15日
    00
  • Spring整合Springmvc的相关介绍

    Spring和SpringMVC是两个非常流行的Java框架,它们可以很好地协同工作。在本文中,我们将介绍如何将Spring和SpringMVC整合在一起。 1. 配置Spring 首先,我们需要配置Spring。我们可以使用XML配置文件或Java配置类来配置Spring。例如,我们可以使用Java配置类来配置Spring。例如: @Configurati…

    Java 2023年5月18日
    00
  • JAVA中的for循环几种使用方法讲解

    JAVA中的for循环几种使用方法讲解 在Java中,for循环是最常用的循环结构之一。它可以重复执行代码块,根据不同的循环条件可以有多种使用方式。 基本的for循环 最基本的for循环有三个部分,分别是循环变量初始化、循环条件和循环变量的更新。语法如下: for (循环变量初始化; 循环条件; 循环变量的更新) { // 循环体代码块 } 其中,循环变量初…

    Java 2023年5月26日
    00
  • java中构造方法及this关键字的用法实例详解(超详细)

    Java中构造方法及this关键字的用法实例详解 构造方法是什么 在Java中,构造方法是一种特殊的成员方法,用于创建对象时初始化对象的状态。一个类可以拥有多个构造方法,但是这些方法必须要有不同的参数列表或参数顺序。 构造方法与一般的成员方法不同,它没有返回值类型,甚至没有void关键字,因为它的返回值就是创建的对象本身。 构造方法的使用 在Java中,当我…

    Java 2023年5月26日
    00
  • 图解Java经典算法插入排序的原理与实现

    图解Java经典算法插入排序的原理与实现 插入排序是一种简单的排序算法,适用于小规模数据的排序,它的基本思想是将一个记录插入到已排好序的有序表中,形成一个新的有序表。此算法在计算机科学教育中是一个简单而重要的算法。 原理 插入排序的原理是:1. 从前向后依次选择未排序序列中的第一个元素;2. 将它插入到已排序的序列的合适位置中。 插入排序具体的实现方式是:-…

    Java 2023年5月19日
    00
  • java 多线程交通信号灯模拟过程详解

    Java多线程交通信号灯模拟是一个经典的多线程案例,它可以很好的展示多线程的同时执行与互斥访问的特性,是多线程初学者不可错过的一个练手项目。下面我将详细讲解其完整攻略。 一、技术原理 线程同步:多个线程之间的相互协作都要通过线程同步来达到,Java中提供了多种同步机制,而这里最常用的是 synchronized 关键字来实现同步。 阻塞与唤醒:在多线程中,需…

    Java 2023年5月19日
    00
  • Java实现文件或文件夹的复制到指定目录实例

    Java 实现文件或文件夹的复制到指定目录可以使用 NIO 的 Files 类,以下是实现一份文件的复制到目标文件夹的代码示例。 import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java…

    Java 2023年5月19日
    00
  • java中Scanner输入用法实例

    Java中Scanner输入用法实例 Scanner类介绍 Scanner类是Java.util中的一个类,用于接收用户从键盘输入的数据,将输入的数据转换为相应的数据类型。 Scanner使用方法 导包 Scanner所在的包是java.util,所以用到Scanner时要导入该包。 import java.util.Scanner; 创建Scanner对象…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部