關於Java對象深度Clone以及序列化與反序列化的使用

        咱們能夠利用clone方法來實現對象只見的複製,但對於比較複雜的對象(好比對象中包含其餘對象,其餘對象又包含別的對象.....)這樣咱們必須進行層層深度clone,每一個對象須要實現 cloneable接口,比較麻煩,那就繼續學習下一個序列化方法。java

建立ide

/*
 * 文 件 名: 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));
    }
}

結果:this

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

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

從結果能夠看到當修改序列化後的對象的值不會影響原先對象的值,因此能夠經過序列化進行深度克隆orm

相關文章
相關標籤/搜索