`

ObjectInputStream、ObjectOutputStream实现对象的克隆

阅读更多

    CloneUtil类:

package com.bijian.study.clone;

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

public class CloneUtil {

    public static void main(String[] args) {
        //创建一个对象
        TemplateObject templateObject = new TemplateObject();
        templateObject.setAge(10);
        templateObject.setName("test");
        ArrayList<String> descriptions = new ArrayList<String>();
        descriptions.add("是一个好人");
        descriptions.add(new String("好姑娘"));
        descriptions.add(new String("硕士毕业"));
        descriptions.add(new String("白富美"));
        templateObject.setDescriptionList(descriptions);
        
        Style style = new Style();
        style.setLength(1600);
        style.setType("欧美风");
        Clothing clothing = new Clothing();
        clothing.setColor("红色");
        clothing.setSize(160);
        clothing.setStyle(style);
        templateObject.setClothing(clothing);
        
        System.out.println(templateObject);
        
        TemplateObject cloneTemplateObject = (TemplateObject) CloneUtil.getCloneObject(templateObject);
        
        System.out.println(cloneTemplateObject);
        
        System.out.println("templateObject==templateObject:" + (templateObject == cloneTemplateObject));
        System.out.println("templateObject.equals(templateObject):" + (templateObject.equals(cloneTemplateObject)));
        System.out.println("templateObject.toString().equals(templateObject.toString()):" + (templateObject.toString().equals(cloneTemplateObject.toString())));
    }
    
    // 克隆对象
    public static Object getCloneObject(Object bean) {
        Object cloneBean = null;
        try {
            ByteArrayOutputStream byout = new ByteArrayOutputStream();
            ObjectOutputStream obj = new ObjectOutputStream(byout);
            obj.writeObject(bean);
            ByteArrayInputStream byin = new ByteArrayInputStream(byout.toByteArray());
            ObjectInputStream ins = new ObjectInputStream(byin);
            cloneBean = (Object) ins.readObject();
        } catch (Exception ex) {
            System.err.print(ex);
        }
        return cloneBean;
    }
}

   TemplateObject类:

package com.bijian.study.clone;

import java.io.Serializable;
import java.util.ArrayList;

public class TemplateObject implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 6790908190923407706L;
    
    private int age;
    private String name;
    private ArrayList<String> descriptionList;
    private Clothing clothing;
    
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public ArrayList getDescriptionList() {
        return descriptionList;
    }
    public void setDescriptionList(ArrayList descriptionList) {
        this.descriptionList = descriptionList;
    }
    public Clothing getClothing() {
        return clothing;
    }
    public void setClothing(Clothing clothing) {
        this.clothing = clothing;
    }
    
    public String toString() {
        
        String baseInfo = String.valueOf(age) + name;
        
        String descriptions = "";
        for(int i=0;i<descriptionList.size();i++) {
            descriptions += descriptionList.get(i).toString();
        }
        
        return baseInfo + descriptions + clothing;
    }
}

      Clothing类: 

package com.bijian.study.clone;

import java.io.Serializable;

public class Clothing implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -2876485615924815655L;
    private String color;
    private int size;
    private Style style;
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public int getSize() {
        return size;
    }
    public void setSize(int size) {
        this.size = size;
    }
    public Style getStyle() {
        return style;
    }
    public void setStyle(Style style) {
        this.style = style;
    }
    
    public String toString() {
        
        return color + String.valueOf(size) + style;
    }
}

      Style类:

package com.bijian.study.clone;

import java.io.Serializable;

public class Style implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -7052770518598516803L;
    private String type;
    private int length;
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public int getLength() {
        return length;
    }
    public void setLength(int length) {
        this.length = length;
    }
    
    public String toString() {
        
        return type + String.valueOf(length);
    }
}

运行结果:

10test是一个好人好姑娘硕士毕业白富美红色160欧美风1600
10test是一个好人好姑娘硕士毕业白富美红色160欧美风1600
templateObject==templateObject:false
templateObject.equals(templateObject):false
templateObject.toString().equals(templateObject.toString()):true

  

分享到:
评论

相关推荐

    java 对象克隆

    三、深克隆实现 实现深克隆通常需要递归地遍历对象的所有属性,包括嵌套的对象和集合。对于复杂的对象结构,可以使用序列化和反序列化技术来实现深克隆。首先,将对象序列化为字节数组,然后反序列化为新的对象。...

    Java对象的深克隆与浅克隆详解.zip(wcb2003)

    克隆主要用于创建对象的备份、实现复制功能或者在多线程环境中避免共享状态。Java提供了两种主要的克隆方式:浅克隆(Shallow Clone)和深克隆(Deep Clone)。下面我们将深入探讨这两种克隆方法。 ### 浅克隆 浅...

    clone()方法示例(对象克隆)_对象克隆_nervouse78_源码

    在实际编程中,除了`clone()`方法,还可以考虑使用`Serializable`接口结合`ObjectInputStream`和`ObjectOutputStream`实现序列化和反序列化来创建对象的深拷贝。这种方法虽然相对复杂,但对于复杂对象结构的完全复制...

    对象的写入与读取。将一个类的对象(例如:Calendar)写入到文件,然后顺序读出该对象,并验证读出的对象是否原始对象的克隆。

    实验的目的是让开发者熟悉Java的流概念,掌握字符和对象输入/输出流的使用,以及如何通过序列化和反序列化实现对象的持久化。通过这个实验,可以学习到如何利用Java I/O流处理文件,以及如何利用序列化进行对象的...

    java对象复制克隆

    标签中的“复制java对象”、“深度克隆”和“深度复制实例”强调了我们要关注的是Java中如何实现对象的深拷贝,并提供了实际操作的例子。在编写代码时,应该遵循良好的编程实践,包括适当的命名、注释和错误处理,以...

    JAVA浅克隆与深克隆

    在Java中,深克隆通常通过序列化和反序列化来实现,或者手动创建一个新的对象并复制所有字段。下面是一个使用序列化实现深克隆的例子: ```java import java.io.*; // 在Student类中添加序列化和反序列化方法 ...

    java 深克隆 浅克隆

    - **算法中**:在一些算法实现中,如搜索或排序,克隆可以帮助我们处理临时对象,而不影响原始数据。 ### 4. 注意事项 - 实现`Cloneable`接口时,Java官方建议覆盖`clone()`方法并抛出`CloneNotSupportedException...

    java的深度克隆的例子

    1. **实现Serializable接口**:让需要克隆的对象实现`Serializable`接口,这样可以将对象转换为字节数组,然后再恢复为新的对象。 ```java public class MyClass implements Serializable { // ... } ``` 2. **序列...

    java深度克隆

    2. **手工编写方式**:对于复杂对象或者包含大量循环引用的对象,可以通过重写对象中的`clone()`方法并手动处理其中的引用类型成员变量来实现深度克隆。这种方式更加灵活,但编写起来相对复杂且容易出错。 #### 三...

    深度克隆的事例代码

    在JavaScript中,我们可以使用JSON对象的`parse()`和`stringify()`方法来实现深度克隆: ```javascript function deepClone(obj) { return JSON.parse(JSON.stringify(obj)); } ``` 这种方法简单易用,但不适用于...

    克隆和序列化(Java )

    在Java编程语言中,克隆和序列化是两个重要的概念,它们在数据处理和对象管理中扮演着关键角色。下面将分别对这两个概念进行详细解释,并结合实例和源代码进行阐述。 **一、克隆** 1. **克隆定义**:克隆是指创建...

    (源码下载)jdk6.0从入门到精通-----chapter2--输入输出,克隆对象

    4. **对象序列化**:通过`ObjectInputStream`和`ObjectOutputStream`,Java支持对象的序列化和反序列化,允许将对象转换为字节流并存储或在网络上传输。 **对象克隆** Java中的对象克隆是指创建一个现有对象的副本...

    Java利用序列化实现对象深度clone的方法

    有多种方式可以实现对象克隆,其中一种就是通过Java的序列化机制。序列化是将对象的状态转换为字节流的过程,而反序列化则是将字节流恢复为对象状态的过程。这种机制可以用来实现深度克隆,即不仅克隆对象本身,还...

    java对象拷贝常见面试题及应答汇总

    如何实现对象克隆? 有两种方式可以实现对象克隆: 1. 实现Cloneable接口并重写Object类中的clone()方法。 2. 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。 下面是一个...

    Java对象流实例代码

    该机制通过使用ObjectOutputStream和ObjectInputStream两个类来实现对象的序列化和反序列化。 在Java对象流实例代码中,主要使用了ObjectOutputStream和ObjectInputStream两个类。ObjectOutputStream用于将对象写入...

    深入JAVA对象深度克隆的详解

    `copy()`方法使用`ObjectOutputStream`将当前对象写入字节数组,然后通过`ObjectInputStream`读取这个字节数组并反序列化为新对象。 值得注意的是,深度克隆可能会带来一些潜在的问题。序列化和反序列化过程可能会...

    Java面试资料之IO相关

    实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。在 Object 基类中,有一个方法叫 clone,产生一个前期对象的克隆,克隆对象是原对象的拷贝,由于引用类型的存在,有深克隆和...

    Java设计模式之原型模式.docx

    以下是一个简单的深克隆实现示例: ```java import java.io.*; // 原型接口 public interface Prototype { Prototype clone() throws CloneNotSupportedException; } // 具体原型类,实现深克隆 public class ...

Global site tag (gtag.js) - Google Analytics