通过序列化进行深层复制(java)

若研究一下第10章介绍的那个Java 1.1对象序列化示例,可能发现若在一个对象序列化以后再撤消对它的序列化,或者说进行装配,那么实际经历的正是一个“克隆”的过程。
那么为什么不用序列化进行深层复制呢?下面这个例子通过计算执行时间对比了这两种方法:
 

//: Compete.java
import java.io.*;

class Thing1 implements Serializable {}
class Thing2 implements Serializable {
  Thing1 o1 = new Thing1();
}

class Thing3 implements Cloneable {
  public Object clone() {
    Object o = null;
    try {
      o = super.clone();
    } catch (CloneNotSupportedException e) {
      System.out.println("Thing3 can't clone");
    }
    return o;
  }
}

class Thing4 implements Cloneable {
  Thing3 o3 = new Thing3();
  public Object clone() {
    Thing4 o = null;
    try {
      o = (Thing4)super.clone();
    } catch (CloneNotSupportedException e) {
      System.out.println("Thing4 can't clone");
    }
    // Clone the field, too:
    o.o3 = (Thing3)o3.clone();
    return o;
  }
}

public class Compete {
  static final int SIZE = 5000;
  public static void main(String[] args) {
    Thing2[] a = new Thing2[SIZE];
    for(int i = 0; i < a.length; i++)
      a[i] = new Thing2();
    Thing4[] b = new Thing4[SIZE];
    for(int i = 0; i < b.length; i++)
      b[i] = new Thing4();
    try {
      long t1 = System.currentTimeMillis();
      ByteArrayOutputStream buf =
        new ByteArrayOutputStream();
      ObjectOutputStream o =
        new ObjectOutputStream(buf);
      for(int i = 0; i < a.length; i++)
        o.writeObject(a[i]);
      // Now get copies:
      ObjectInputStream in =
        new ObjectInputStream(
          new ByteArrayInputStream(
            buf.toByteArray()));
      Thing2[] c = new Thing2[SIZE];
      for(int i = 0; i < c.length; i++)
        c[i] = (Thing2)in.readObject();
      long t2 = System.currentTimeMillis();
      System.out.println(
        "Duplication via serialization: " +
        (t2 - t1) + " Milliseconds");
      // Now try cloning:
      t1 = System.currentTimeMillis();
      Thing4[] d = new Thing4[SIZE];
      for(int i = 0; i < d.length; i++)
        d[i] = (Thing4)b[i].clone();
      t2 = System.currentTimeMillis();
      System.out.println(
        "Duplication via cloning: " +
        (t2 - t1) + " Milliseconds");
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
} ///:~

其中,Thing2和Thing4包含了成员对象,所以需要进行一些深层复制。一个有趣的地方是尽管Serializable类很容易设置,但在复制它们时却要做多得多的工作。克隆涉及到大量的类设置工作,但实际的对象复制是相当简单的。结果很好地说明了一切。下面是几次运行分别得到的结果:
的确
 

Duplication via serialization: 3400 Milliseconds
Duplication via cloning: 110 Milliseconds

Duplication via serialization: 3410 Milliseconds
Duplication via cloning: 110 Milliseconds

Duplication via serialization: 3520 Milliseconds
Duplication via cloning: 110 Milliseconds

除了序列化和克隆之间巨大的时间差异以外,我们也注意到序列化技术的运行结果并不稳定,而克隆每一次花费的时间都是相同的。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索new
, system
, clone
, 深层复制
, serialization
, 深层克隆对象
Compete
java深层复制、深层复制、java 序列化、java序列化和反序列化、java序列化的作用,以便于您获取更多的相关知识。

时间: 2024-11-05 06:08:23

通过序列化进行深层复制(java)的相关文章

用Vector进行深层复制

下面让我们复习一下本章早些时候提出的Vector例子.这一次Int2类是可以克隆的,所以能对Vector进行深层复制:   //: AddingClone.java // You must go through a few gyrations to // add cloning to your own class. import java.util.*; class Int2 implements Cloneable { private int i; public Int2(int ii) {

java-从别人那里复制Java项目,连同git一同复制过来,可以删除master吗?

问题描述 从别人那里复制Java项目,连同git一同复制过来,可以删除master吗? 我这里本身项目有些问题,删除后从经理那里复制了全部项目过来,连同git文件. 现在我这除了自己的分支外,还有他的分支及master.现在我想问,我这里到底有几个 分支,如果删除了master,是不是主分支的内容就被我删除了? 解决方案 为什么要复制过来呢,下一个呗.可以删除,删除之后要提交恐怕就有问题了 解决方案二: master是主进程,一般不建议删除,master是指向主版本进程的指针,一般如果项目到了一

python中如何深层复制queue对象?

问题描述 python中如何深层复制queue对象? 如题 直接用赋值语句得到的是引用,copy方法也是得到引用.deepcopy()报错. 除了把队列中的元素全部get出来,再put进去的方法外 ,还有什么好方法吗? 解决方案 没其他办法,只能一个个取出来,然后每个元素deepcopy,插入新队列

什么是java序列化,如何实现java序列化?

问题描述 这是java的序列,但是如果应该理解呢 解决方案 序列化是将一个JAVA对象转化为一个描述该对象的位块(bit-blob);对象一旦变成了bit-blob后,就可以发送到任何硬盘/网络上:准备再使用该对象时,要将bit-blob解序列化为JAVA对象方可使用. 变为可序列化的,只要实现java.lang.Serializable接口. 用静态关键字标识的对象不能序列化,并且在解序列是无效的. 请参考:http://tracylau.iteye.com/blog/23311解决方案二:序

android 浅复制和深复制-Java Generic Deep Copy 篇

关于Java Generic Deep Copy 在java中的应用和注意事项,请参考:http://blog.csdn.net/yang_hui1986527/article/details/7039425 而关于在android程序中通过clone方法来进行浅复制和深复制,请参考:http://blog.csdn.net/yang_hui1986527/article/details/7036818 众所周知,android上层使用的是java语言,因此理论上于Java Generic De

Java中主要Map类概述

Map: 1.Map的一级接口大概有这三个:SortedMap.ConcurrentMap(1.5).和Bindings(1.6). SortedMap: 1).SortedMap的直接接口有NavigableMap(1.6).间接接口有ConcurrentNavigableMap(1.6).主要实现类有TreeMap. ConcurrentSkipListMap(1.6). 2).SortedMap是一个提供对键值进行排序的接口.排序规则是根据其键的自然顺序进行排序的,或者根据在创建有序映射时

JAVA序列化

什么是序列化和反序列化     Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程. 什么情况下需要序列化 当你想把的内存中的对象保存到一个文件中或者数据库中时候(数据持久化): 利用序列化实现远程通信,即在网络上传送对象的字节序列: 如何实现序列化     将需要序列化的类实现Serializable接口就可以了,Serializable接口中没有任何方法,可以理解为一个标记,即表明这个类可以序列

Java序列化(Serialization) 机制_java

  Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端.这就需要有一种可以在两端传输数据的协议.Java序列化机制就是为了解决这个问题而产生. 将对象状态转换成字节流之后,可以用java.io包中各种字节流的类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机.对象序列化功能非常简单.强大,在RMI.Socket.JMS.EJB都有应用.对象序列化问题在网络编程中并不是最核心的课题,但却相当重要,具有许多实用意义. java对象序列

java教程之对象序列化使用基础示例详解_java

这个过程也可以通过网络实现,可以先在Windows机器上创建一个对象,对其序列化,然后通过网络发给一台Unix机器,然后在那里准确无误地重新"装配".像RMI.Socket.JMS.EJB它们中的一种,彼此为什么能够传递Java对象,当然都是对象序列化机制的功劳.  Java对象序列化机制一般来讲有两种用途: Java的JavaBeans: Bean的状态信息通常是在设计时配置的,Bean的状态信息必须被存起来,以便当程序运行时能恢复这些状态信息,这需要将对象的状态保存到文件中,而后能