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

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日

相关文章

  • tomcat性能优化(性能总览)

    Tomcat性能优化(性能总览) 为了提高Tomcat的性能,可以考虑以下几个方面的优化: 1. 确定性能瓶颈 我们需要确定Tomcat的性能瓶颈。可以使用JProfiler等工具来对Tomcat进行性能分析和优化。通过分析Tomcat的CPU利用率、内存使用情况、I/O和网络延迟情况等指标,可以帮助我们定位性能瓶颈。 2. Tomcat服务器配置优化 2.…

    Java 2023年5月19日
    00
  • java删除文件和文件夹具体实现

    当我们需要清理旧数据或者卸载应用程序时,通常需要删除一些文件或者文件夹。下面我来讲解一下Java中如何删除文件和文件夹的实现过程。 删除文件 Java中删除文件的方式非常简单,使用Java的File类提供的delete()方法即可。该方法有一个返回值,表示是否成功删除文件。 例如,我有一个名为test.txt的文件,它的绝对路径为C:\Users\usern…

    Java 2023年5月20日
    00
  • Java实现世界上最快的排序算法Timsort的示例代码

    下面就针对 “Java实现世界上最快的排序算法Timsort的示例代码” 进行详细讲解。 1. Timsort排序算法简介 Timsort是一种优化的归并排序算法,最初由Tim Peters在2002年设计并实现,它结合了插入排序与归并排序,以达到在不同长度的输入数据上执行最快的速度。Timsort最明显的特点是,它可以在O(n log n)的时间内完成大部…

    Java 2023年5月19日
    00
  • 学java得这样学,学习确实也得这样

    学习Java需要掌握必要的基础知识,同时要注重实践,不断尝试实现具体的代码,以下是学习Java的完整攻略: 基础知识 语言基础 一门编程语言的语言基础,即语法结构和语言特性是学习该语言的基础,Java也不例外。 Java编程语言语言基础包括变量、运算符、控制语句等,学习者需要先掌握语言基础部分,方能打好基础,后续的代码实现才能更加顺利。 面向对象 Java是…

    Java 2023年6月15日
    00
  • Java 实现连接sql server 2000

    下面是实现Java连接Sql Server 2000的完整攻略: 准备工作 下载 SQL Server 2000 的 JDBC 驱动包,可从 Microsoft 官网下载。将驱动包放入项目的 lib 目录下。 确认目标 SQL Server 2000 实例正常启动,确保可以连接。 开启目标 SQL Server 2000 的远程连接功能,具体方法可百度“sq…

    Java 2023年5月20日
    00
  • springboot项目整合注册功能模块开发实战

    Spring Boot是一个非常流行的Java框架,它可以帮助开发人员快速构建基于Spring的应用程序。在本文中,我们将详细讲解如何使用Spring Boot开发注册功能模块,并提供两个示例来演示如何整合注册功能模块。 开发注册功能模块 在开发注册功能模块之前,我们需要先创建一个Spring Boot项目。可以使用Spring Initializr或者手动…

    Java 2023年5月15日
    00
  • Spring Security整合CAS的示例代码

    下面是我对于Spring Security整合CAS的示例代码的攻略: 前置知识 在开始讲解Spring Security整合CAS的示例代码之前,需要先了解以下几个概念: CAS (Central Authentication Service) CAS是一个单点登录协议,可以让用户在多个Web应用中进行统一认证和授权。对于用户进行登录的请求,CAS服务会将…

    Java 2023年5月20日
    00
  • SpringBoot 自动配置原理及源码解析

    Spring Boot是一个快速构建应用程序的框架,它提供了许多常用的功能,如自动配置、依赖管理、Web开发、数据访问等。其中,自动配置是Spring Boot的一个重要特性,它可以根据应用程序的依赖和配置来自动配置应用程序。以下是Spring Boot自动配置原理及源码解析的完整攻略: 自动配置原理 Spring Boot的自动配置原理基于Spring F…

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