import java.io.*;
@SuppressWarnings("all")
public class CloneBySerializable implements Serializable {
private int j;
private Thing thing;
public CloneBySerializable(int j) {
this.j = j;
this.thing = new Thing(j);
}
public static void main(String[] args) {
CloneBySerializable[] arr = new CloneBySerializable[10000];
for (int i = 0, length = arr.length; i < length; i++) {
arr[i] = new CloneBySerializable(i);
}
try {
long t1 = System.currentTimeMillis();
ByteArrayOutputStream buf =
new ByteArrayOutputStream();
ObjectOutputStream o =
new ObjectOutputStream(buf);
for(int i = 0; i < arr.length; i++)
o.writeObject(arr[i]);
ObjectInputStream in =
new ObjectInputStream(
new ByteArrayInputStream(
buf.toByteArray()));
CloneBySerializable[] copy = new CloneBySerializable[arr.length];
for(int i = 0; i < copy.length; i++)
copy[i] = (CloneBySerializable) in.readObject();
long t2 = System.currentTimeMillis();
System.out.println("Duplication via serialization: " +
(t2 - t1) + " Milliseconds");
} catch (Exception ex) {
ex.printStackTrace();
}
//单例类防止复制
Dog newDog = (Dog) deepCopy(Dog.INSTANCE);
System.out.println(newDog == Dog.INSTANCE); //true
}
static class Dog extends Exception {
public static final Dog INSTANCE = new Dog();
private Dog() {}
public String toString(){
return "Woof";
}
//用于解决返回新实例的问题
private Object readResolve(){
return INSTANCE;
}
}
static public Object deepCopy(Object obj){
try{
ByteArrayOutputStream bos =
new ByteArrayOutputStream();
new ObjectOutputStream(bos).writeObject(obj);
ByteArrayInputStream bin =
new ByteArrayInputStream(bos.toByteArray());
return new ObjectInputStream(bin).readObject();
} catch(Exception e) {
throw new IllegalArgumentException(e);
}
}
}
@SuppressWarnings("all")
class Thing implements Serializable {
private int i;
public Thing(int i) {
this.i = i;
}
}
java序列化实现的对象复制性能比clone差
一个实现了Serializable 的单例类,必须有一个readResolve 方法,用以返回它的唯一的实例。
对一个实现了Serializable 的类进行了扩展,或者实现了一个扩展自Serializable 的接口,
使得我们在无意中实现了Serializable。
Java序列化与单例模式
本文通过一个Java示例程序介绍了如何使用序列化来复制对象,并比较了序列化复制与克隆方法的性能差异。此外,还展示了如何在实现了Serializable接口的单例类中通过readResolve方法确保单例模式的有效性。
1474

被折叠的 条评论
为什么被折叠?



