对于可序列化(实现Serializable接口)的对象,封装它的list集合可以通过以下方法实现深拷贝
public static <T> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(src);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(byteIn);
@SuppressWarnings("unchecked")
List<T> dest = (List<T>) in.readObject();
return dest;
}
扩展一下,其实只要对象实现了Serializable接口,都可以用序列化的方式实现对象的深拷贝
public static <T extends Serializable> T clone(T t) {
T cloneObj = null;
try {
// 将对象写入字节流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(t);
oos.close();
// 从字节流中读取
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
cloneObj = (T) ois.readObject();
ois.close();
}
catch (Exception e) {
e.printStackTrace();
}
return cloneObj;
}
已有轮子:
Apache的commons-lang包下面的工具类SerializationUtils已经为我们实现了拷贝功能,方法的源码如下:
public static Object clone(Serializable object)
{
return deserialize(serialize(object));
}
其接受的参数object就是Serializable类型的
我们可以直接调用其方法实现对象拷贝(例子中的Student类实现了Serializable接口)
public static void main(String[] args) {
Student student = new Student();
Student clone = (Student) org.apache.commons.lang.SerializationUtils.clone(student);
System.out.println(student.toString());
System.out.println(clone.toString());
}
分享到:
相关推荐
深拷贝:指的是拷贝一个对象时,不仅仅把对象的引用进行复制,还把该对象引用的值也一起拷贝。如果引用类型里面还包含很多引用类型,或者内层引用类型的类里面又包含多层...这时我们可以用序列化来实现对象的深拷贝。
如果 List<T> 里的 T 是引用类型(如myClass类),则在 像这种写法: ...但最好用和最方便的方法还是使用【序列化】的方式来实现。 序列化是指将对象转换为字节流的形式,然后保存在内存或者数据库中
delphi JSON序列化反序列化带List
用C#实现List对象的序列化,大家可以看看,也可以多提宝贵意见。
/// Json序列化与反序列化方法封装类 /// public static class JsonConvert { /// /// 序列化模型对象为Json /// /// 模型类型 /// 模型对象 /// <returns></returns> public static string GetJson(T...
对于值类型的List直接用以下方法就可以复制: List<T> oldList = new List(); oldList.Add(..); List<T> newList = new List(oldList); 二、List对象中的T是引用类型的情况(例如自定义的实体类) 1、对于引用类型...
C#中二进制数组h和各种常规数组的转换,二进制序列化和json序列化方法以及对应的反序列化方法的例子,帮助初学者。
(抱歉,我无法修改下载积分,本想着免积分的)C#浅拷贝(MemberwiseClone等多种方法)与深拷贝(反射、多种反序列化)实例
我们都知道对象是暂时保存在内存中的,不能用U盘考走了,有时为了使用介质转移对象,并且把对象的状态保持下来,就需要把对象保存下来,这个过程就叫做序列化,通俗点,就是把人的魂(对象)收伏成一个石子(可传输...
在应用java进行c-s开发的时候,尤其涉及到图片和视频之间的传输时,需要用序列化和反序列化技术,希望对您有帮助
主要介绍了实例解析Json反序列化之ObjectMapper,json自定义序列化的方法,需要的朋友可以了解下。
可将对象、集合进行关于XML、JSON 的序列化,或反序列化。
主要介绍了C#自定义序列化ISerializable的实现方法,涉及C#序列化的操作技巧,非常具有实用价值,需要的朋友可以参考下
支持列表 范型的转换等工具 Json字符串生成或解析处理工具类
二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下。 SOAP序列化:对象序列化之后的结果符合SOAP协议,也就是可以...
Unity 中使用Protobuf进行序列化和反序列化的Demo
自己实现的protobuf 压缩类,并能序列化反序列化
jackson json序列化 json反序列化 jar包 直接下载拷贝到项目中buildpath即可使用
序列化和反序列化的封装类,只要调用就行 序列化和反序列化的封装类 序列化和反序列化的封装类 序列化和反序列化的封装类 序列化和反序列化的封装类
C#实现序列化反序列化源码文件;在实际开发中调用里面方法就可以实现序列化和反序列化;适用于各种类型使用;调用简单