序列化实现对象的拷贝

这篇具有很好参考价值的文章主要介绍了序列化实现对象的拷贝。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

提到拷贝,大家第一时间想到的可能都是克隆模式的深克隆,因为这个模式在面试中出现的机率非常高,同时实现的方式也比较容易:对象的类实现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.toymoban.com/news/detail-418468.html

到了这里,关于序列化实现对象的拷贝的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot对象序列化自定义序列化注解

    在开发中有时候会遇到一些内容返回时需要翻译,或者一些内容在序列化之前需要特殊处理(脱敏啥的)。 一般对单个属性可以直接用 jackson 的序列化注解对某个属性单独处理 com.fasterxml.jackson.databind.annotation.JsonSerialize(using= xxx.class) 但是直接使用不太灵活,可以进一步引入注

    2024年02月07日
    浏览(45)
  • 4.4. 对象序列化与反序列化

    在本节中,我们将详细讨论Java中的对象序列化与反序列化概念、使用方法以及实例。对象序列化是将对象的状态信息转换为字节流的过程,而反序列化则相反,是将字节流恢复为对象的过程。 4.4.1 为什么需要对象序列化? 对象序列化的主要目的是为了在不同的系统间传输对

    2024年02月07日
    浏览(50)
  • 一文了解Java序列化和反序列化:对象的存储与传输

    Java序列化是一项强大而重要的技术,它允许我们将对象转换为字节流,以便在存储、传输和重建时使用。在本文中,我们将深入探讨Java序列化的基本概念、使用方法以及一些应用场景。 Java序列化是指将对象转换为字节流的过程,以便可以将其存储到文件、数据库或在网络上

    2024年02月13日
    浏览(31)
  • SharedPreferences工具类保存List对象,自动完成序列化和反序列化

    以下是一个示例的SharedPreferences工具类,其中包含了setList()和getList()方法,用于将List序列化为JSON字符串并存储到SharedPreferences中,以及从SharedPreferences中获取JSON字符串并反序列化为List对象: 在上述代码中,我们定义了一个SharedPreferencesUtils工具类,其中包含了setList()和getLis

    2024年02月16日
    浏览(35)
  • RabbitMQ 消息对象通过 Jackson 库消息转化器 序列化/反序列化 天坑!

    目录 1. 报错的背景 2. 问题分析 3. 最佳解决办法 a)使用 RabbitMQ 发送消息时,发送消息的类型为 MapString, Object,map 里面我 put 了一个 String, Long 类型,如下图: b)这里有一个前提:我清楚使用 org.springframework.amqp.rabbit.core.RabbitTemplate 来发送消息到 RabbitMQ 队列时,消息的序列

    2024年04月15日
    浏览(56)
  • Redis反序列化--操作java对象

    1.前言: 前段时间完成一个需求,上线之后发现每次发起请求服务器查询数据太慢了,组长便说加个两分钟的缓存。便打算使用reids做缓存,因为这个接口返回的是一个java对象,就遇到了序列化的问题。 针对数据的“序列化和反序列化”,提供了多种策略(RedisSerializer) 默认为

    2023年04月08日
    浏览(39)
  • System.Text.Json匿名对象反序列化

    以前就是一直使用 Newtonsoft.Json 用起来还是挺舒服的。由于 JSON 的应用越来越广,现在. NET Core 都内置了 System.Text.Json 可以直接对 JSON 进行操作,不过两个东西的体验依然有点区别。 有时候我们会遇到的从第三方传递过来的 json string 对象,对其进行解析并不需要所有的字段,

    2024年02月06日
    浏览(43)
  • 【优化技术专题】「性能优化系列」针对Java对象压缩及序列化技术的探索之路

    序列化和反序列化 序列化就是指把对象转换为字节码; 对象传递和保存时,保证对象的完整性和可传递性。把对象转换为有字节码,以便在网络上传输或保存在本地文件中; 反序列化就是指把字节码恢复为对象; 根据字节流中保存的对象状态及描述信息,通过反序列化重建

    2024年01月22日
    浏览(50)
  • 网络数据通信—ProtoBuf实现序列化和反序列化

    目录 前言 1.环境搭建 2. centos下编写的注意事项 3.约定双端交互接口 4.约定双端交互req/resp 5. 客户端代码实现 6.服务端代码实现 Protobuf还常用于通讯协议、服务端数据交换场景。那么在这个示例中,我们将实现一个网络版本的通讯录,模拟实现客户端与服务端的交互,通过P

    2024年02月04日
    浏览(39)
  • org.springframework.data.redis.serializer.SerializationException: Cannot serialize(解决redis存入对象序列化)

    在调用service 实现类时报出以上错误,原因是因为 spring会先将对象序列化,再存入redis进行缓存,而entity没有实现序列化接口,因此序列化出错,需要在对应的实体类中添加序列化即可(implements Serializable),如下:

    2024年02月14日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包