关于Java对象深度Clone以及序列化与反序列化的使用
博客专区 > binhu 的博客 > 博客详情
关于Java对象深度Clone以及序列化与反序列化的使用
binhu 发表于2年前
关于Java对象深度Clone以及序列化与反序列化的使用
  • 发表于 2年前
  • 阅读 46
  • 收藏 5
  • 点赞 1
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

        我们可以利用clone方法来实现对象只见的复制,但对于比较复杂的对象(比如对象中包含其他对象,其他对象又包含别的对象.....)这样我们必须进行层层深度clone,每个对象需要实现 cloneable接口,比较麻烦,那就继续学习下一个序列化方法。

创建

/*
 * 文 件 名: A.java 版 权: Unis Cloud Information Technology Co., Ltd. Copyright
 * 2015, All rights reserved 描 述: <描述> 修 改 人: Administrator 修改时间: 2015-11-10
 * 跟踪单号: <跟踪单号> 修改单号: <修改单号> 修改内容: <修改内容>
 */
package com.hubin.supers;

import java.io.Serializable;

/**
 * <一句话功能简述> <功能详细描述>
 * 
 * @author Administrator
 * @version [版本号, 2015-11-10]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class A implements Serializable {
    private String name;
    
    private int age;
    
    /**
     * @return 返回 name
     */
    public String getName() {
        return name;
    }
    
    /**
     * @param 对name进行赋值
     */
    public void setName(String name) {
        this.name = name;
    }
    
    /**
     * @return 返回 age
     */
    public int getAge() {
        return age;
    }
    
    /**
     * @param 对age进行赋值
     */
    public void setAge(int age) {
        this.age = age;
    }
      /**
     * @return
     */
    @Override
    public String toString() {
        return "A [name=" + name + ", age=" + age + "]";
    }
    
}

创建B类:

/*
 * 文 件 名: B.java 版 权: Unis Cloud Information Technology Co., Ltd. Copyright
 * 2015, All rights reserved 描 述: <描述> 修 改 人: Administrator 修改时间: 2015-11-10
 * 跟踪单号: <跟踪单号> 修改单号: <修改单号> 修改内容: <修改内容>
 */
package com.hubin.supers;

import java.io.Serializable;

/**
 * <一句话功能简述> <功能详细描述>
 * 
 * @author Administrator
 * @version [版本号, 2015-11-10]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class B implements Serializable {
    private A a;
    
    private String name;
    
    /**
     * @return 返回 a
     */
    public A getA() {
        return a;
    }
    
    /**
     * @param 对a进行赋值
     */
    public void setA(A a) {
        this.a = a;
    }
    
    /**
     * @return 返回 name
     */
    public String getName() {
        return name;
    }
    
    /**
     * @param 对name进行赋值
     */
    public void setName(String name) {
        this.name = name;
    }
    
    /**
     * @return
     */
    @Override
    public String toString() {
        return "B [a=" + a + ", name=" + name + "]";
    }
}

创建测试Desc类:

/*
 * 文 件 名: Desc.java 版 权: Unis Cloud Information Technology Co., Ltd. Copyright
 * 2015, All rights reserved 描 述: <描述> 修 改 人: Administrator 修改时间: 2015-11-10
 * 跟踪单号: <跟踪单号> 修改单号: <修改单号> 修改内容: <修改内容>
 */
package com.hubin.supers;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author Administrator
 * @version [版本号, 2015-11-10]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class Desc {
    public static void main(String[] args) throws Exception {
        A a = new A();
        a.setName("张三");
        a.setAge(10);
        B b = new B();
        b.setA(a);
        b.setName("南京");
        List<B> list = new ArrayList<B>();
        list.add(b);
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(byteOut);
        out.writeObject(list);
        ByteArrayInputStream byteIn = new ByteArrayInputStream(
                byteOut.toByteArray());
        ObjectInputStream in = new ObjectInputStream(byteIn);
        List<B> list1 = (List<B>) in.readObject();
        list1.get(0).getA().setName("李四");
        System.out.println(list.get(0));
        System.out.println(list1.get(0));
    }
}

结果:

B [a=A [name=张三, age=10], name=南京]

B [a=A [name=李四, age=10], name=南京]

从结果可以看到当修改序列化后的对象的值不会影响原先对象的值,所以可以通过序列化进行深度克隆


共有 人打赏支持
粉丝 15
博文 185
码字总数 193880
×
binhu
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: