序列化实现对象的拷贝

提到拷贝,大家第一时间想到的可能都是克隆模式的深克隆,因为这个模式在面试中出现的机率非常高,同时实现的方式也比较容易:对象的类实现Cloneable接口并且重写clone()方法即可。但是在实际情况中克隆模式有时候其实并不适合用来拷贝对象,因为如果有很多的实体类都需要拷贝,这个时候难道把这些实体类全都实现克隆模式?这是不提倡的,这个时候可以使用序列化方式来实现对象的拷贝。

需要拷贝的类必须实现序列化Serializable

package org.utils;

import lombok.Getter;
import lombok.Setter;
import lombok.SneakyThrows;

import java.io.*;

/**
 * 通过序列化方式实现clone
 * copyFrom需要实现Serializable
 */
public class CloneUtil {

    @SneakyThrows
    public static <T extends Serializable> T clone(T copyFrom) {
        T cloneObj = null;
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(copyFrom);
        objectOutputStream.close();

        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
        ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
        cloneObj = (T) objectInputStream.readObject();
        objectInputStream.close();

        return cloneObj;
    }

    public static void main(String[] args) {
        User user = new User();
        user.setAge(30);
        user.setName("李四");
        User cloneUser = CloneUtil.clone(user);
        System.out.println(cloneUser.toString());
    }

    @Getter
    @Setter
    public static class User implements Serializable {
        {
            name = "张三";
            age = 20;
            location = "xxx";
        }

        private String name;
        private Integer age;
        private String location;

        @Override
        public String toString() {
            return "name:" + name + ",age:" + age + ",location:" + location;
        }

    }
}

 

原文链接:https://www.cnblogs.com/hx-web/p/17331214.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:序列化实现对象的拷贝 - Python技术站

(0)
上一篇 2023年4月19日
下一篇 2023年4月19日

相关文章

  • Ext javascript建立超链接,进行事件处理的实现方法

    下面是关于在 ExtJS 中建立超链接并进行事件处理的实现方法的攻略。 1. 建立超链接 要在 ExtJS 中建立超链接,可以使用 Ext.dom.Element 类的 setHtml 方法。此方法可以设置元素的 innerHTML 属性,因此可以通过设置一个包含超链接代码的字符串来建立超链接。 例如,下面的代码使用 setHtml 方法建立一个包含超链接的…

    Java 2023年6月15日
    00
  • java中使用Files.readLines()处理文本中行数据方式

    下面是详细的攻略: 1. 引入依赖 在使用 Files.readLines() 之前,我们需要先引入相应的依赖包。 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version&…

    Java 2023年5月19日
    00
  • 在eclipse中中文汉字乱码的解决方案

    下面是在eclipse中解决中文乱码的完整攻略,包含以下步骤: 1. 修改eclipse编码格式 打开eclipse,找到菜单栏上的“Window”选项,然后点击“Preferences”。在弹出的窗口中,找到“General”选项,展开后点击“Workspace”。在右侧的“Text file encoding”下拉框中,选择“UTF-8”。然后点击下面的…

    Java 2023年5月19日
    00
  • Java-SpringBoot-Range请求头设置实现视频分段传输

    老实说,人太懒了,现在基本都不喜欢写笔记了,但是网上有关Range请求头的文章都太水了下面是抄的一段StackOverflow的代码…自己大修改过的,写的注释挺全的,应该直接看得懂,就不解释了写的不好…只是希望能给视频网站开发的新手一点点帮助吧. 业务场景:视频分段传输、视频多段传输(理论上配合前端能实现视频预览功能, 没有尝试过)下面是API测试图…

    Java 2023年4月19日
    00
  • Windows系统下安装Tomcat服务器和配置虚拟目录的方法

    安装Tomcat服务器: 下载Tomcat安装包:到官网 https://tomcat.apache.org/ 下载指定版本的Tomcat安装包,目前比较常用的版本是8和9。 解压Tomcat安装包:在Windows系统下,将Tomcat安装包解压到指定文件夹,如D盘的Tomcat目录下。 设置环境变量:在Windows系统环境变量中新增一个CATALINA…

    Java 2023年5月19日
    00
  • SpringBoot controller参数校验方法详细讲解

    下面我就为您讲解一下“SpringBoot controller参数校验方法详细讲解”的攻略。 一、前言 Spring Boot 是一个非常流行的 Java 开发框架,可用于快速构建高效率的应用程序。在我们使用 Spring Boot 进行开发的过程中,请求参数的校验也是非常重要的一环。本文将详细讲解 Spring Boot Controller 参数校验的…

    Java 2023年5月20日
    00
  • 详解Spring Security 捕获 filter 层面异常返回我们自定义的内容

    下面是详解“详解Spring Security 捕获 filter 层面异常返回我们自定义的内容”的完整攻略: 简介 Spring Security是一个强大的安全框架,可以帮助开发者快速集成认证、授权等安全相关功能。在使用Spring Security过程中,可能会遇到一些异常或错误。这时,我们需要捕获这些异常,并返回自定义的错误信息。本文将围绕如何在Sp…

    Java 2023年5月20日
    00
  • JavaWeb登录界面登录失败在同一页面进行提示的解决

    JavaWeb登录界面登录失败在同一页面进行提示的解决 当用户在JavaWeb应用程序中的登录界面输入错误的用户名或密码时,我们需要给与用户提示以完成用户友好体验。该过程有多种方法可以完成,其中一种方法是在同一页面上进行提示。本文将讲解如何在同一页面上显示登录失败的提示信息。 第一步:页面设计我们需要在登录页面添加一个div元素,将错误信息放在里面。但是在一…

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