• 对象拷贝与序列化


    1、我们为什么要使用对象拷贝?

    当我们想对一个对象进行操作但是还想保留原有数据进行接下来的操作时,我们可以便可以使用对象拷贝。

    2、对象拷贝有几种类型?

    对象拷贝分为深拷贝和浅拷贝。浅拷贝就是只复制对象的引用地址,而对象的内容不进行复制。深拷贝就是将一个对象的引用地址及其内容全部拷贝。

    3、如何实现对象拷贝呢?

    实现对象拷贝的方式有两种?

    1、让被拷贝的类实现cloneable接口,然后在类里面重写Object类的clone()方法。

    2、让被拷贝的那个类实现serilzable接口,通过流来实现对象的拷贝。

    第一种实现了浅拷贝;推荐使用第二种,因为第二种不但实现了深拷贝,而且还可以加泛型限定,拷贝对象在编译阶段就可以检查出是否支持序列化。

    下面这段代码是引用一位大佬的,我以此为例进行分析

    public class ObjectSerializationDemo {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            File file = new File("D:\\person.out");
            if(!file.exists()){
                file.mkdirs();
            }
            //2、序列化  对象---》objiect流---》文件流---》writeObject(被拷贝对象)写入文件中
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
            Person person = new Person("测试",25,Gender.FEMALE,"ennenen");
            oos.writeObject(person);
            oos.close();
            //3、反序列化  文件----》文件流---》object流---》readObject()获取到流中的对象
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
            Person person1 = (Person) ois.readObject();
            System.out.println(person1);
        }
    } 
    
    /**
     * 1、实现Serializable 表示该类可以被序列化
     */
    public class Person implements Serializable {
        private String name ;
        private Integer age;
        private Gender gender;
        /**
         * transient 的作用是防止变量被序列化,在反序列化的时候transient 变量的值被赋值为初始值
         * transient 只能修饰变量,不能修饰其他的成分
         */
        private transient String introduce;
    
        public Person() {
            System.out.println("none-arg constructor");
        }
    
        public Person(String name, Integer age, Gender gender,String introduce) {
            System.out.println("arg constructor");
            this.name = name;
            this.age = age;
            this.gender = gender;
            this.introduce = introduce;
        }
    
       //省略get 和 set 方法
    
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", gender=" + gender +
                    ", introduce='" + introduce + '\'' +
                    '}';
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    大佬的代码虽好但是没有加泛型限定,其实也没啥就是将序列化和反序列化的那段代码拿出来放在一个方法里,在方法的返回值类型上增加一个泛型如

    引用文章:https://blog.csdn.net/weixin_43610698/article/details/110136372

  • 相关阅读:
    windows下cmd命令行模式中cd变换路径命令无效的解决办法
    Docker部署SpringBoot项目
    11-Django-基础篇-数据库操作
    分布式互斥
    【Pytorch with fastai】第 5 章 :图像分类
    <蓝桥杯软件赛>零基础备赛20周--第2周
    pNA修饰肽:H-D-Leu-Thr-Arg-pNA,H-D-Leu-Thr-Arg-pNA,CAS号: 122630-72-2/3326-63-4
    Visual Components Robotics OLP解决方案 北京衡祖
    TCP粘包拆包的原因及解决办法
    TDSQL携手金蝶云·苍穹,发布“国产数据库联合解决方案”
  • 原文地址:https://blog.csdn.net/weixin_51930617/article/details/126697625