`
julianyuan
  • 浏览: 6487 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

通过序列化拷贝对象

    博客分类:
  • Java
 
阅读更多

前两天做项目的时候需要对某个对象进行复制,但是复制的对象不需要源对象的某些属性值,便在论坛上提问,最后根据大家的回答找到一个比较适合自己的方法,遂记录下来。同时也谢谢各位的回答。

 

有如下这些类(实际的对象之间的关联要比这个复杂):

 

    class A {  
        private Long id;  
        private List<B> listB;  
        private D d;  
        ......  
    }  
      
    class B {  
        private Long id;  
        private A a;  
        private List<C> listC;  
        ......  
    }  
      
    class C {  
        private Long id;  
        private B b;  
        ......  
    }  
      
    class D {  
        private Long id;  
        private A a;  
        ......  
    }  

 

 

现在我需要将A进行复制,但是不需要所有对象的id属性的值。

最后我选择了通过序列化来复制对象,方法如下:

 

首先建立一个基类,基类实现Serializable接口,并有一个栏位“id“,将”id“用transient修饰

 

public class Entity implements Serializable {
	private transient Long id;
	//getter and setter
        ...
}

 然后将所有类都继承这个基类,如果我需要对A进行复制,则通过下面这段代码即可

 

 

    public static Object deepCopy(Object object) throws IOException, ClassNotFoundException{
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        //Serialize
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(object);
	oos.close();
	bos.close();
	//Deserialize
        byte[] data = bos.toByteArray();
	ByteArrayInputStream bais = new ByteArrayInputStream(data);
	ObjectInputStream ois = new ObjectInputStream(bais);
	Evaluation copy = (Evaluation) ois.readObject();
	ois.close();
	bais.close();
	return copy ;
    }

 

deepCopy方法就是用序列化的方法来实现对象的深拷贝,其返回的对象即为我需要的这个对象的拷贝。

我觉得这种方法算是需要的代码量最小的,对现在的项目改动最少的方法。

如果大家有更好的方法或者觉得这个方法有改进的地方,请留言。

 

问题的地址:http://www.iteye.com/problems/120240

 

参考资料:
http://www.oschina.net/translate/serialization-in-java
http://liuwang126.iteye.com/blog/272595
http://kentkwan.iteye.com/blog/739514
http://my1988.2219.heart.blog.163.com/blog/static/8383725220121190213943/

 

0
0
分享到:
评论

相关推荐

    java 对象的序列化与反序列化

    5. **深拷贝与浅拷贝**:序列化实际上是实现了深拷贝,即创建了对象的一个完全独立的副本,修改副本不会影响原对象。 6. **安全性问题**:序列化可能导致安全漏洞,因为恶意用户可以通过反序列化执行任意代码。因此...

    java对象序列化 传输 保存

    Java对象序列化是一种将Java对象转换为字节流的过程,以便可以存储这些对象或通过网络进行传输。这个过程是Java平台的核心特性,它允许开发者将复杂的对象结构持久化或者在网络间进行安全通信。序列化不仅可以用于...

    C# 类序列化 文件数据库 串行化

    当我们需要再次使用这些对象时,可以通过反序列化将字节流恢复为原来的对象实例。 在描述中提到的“文件数据库”,可能是指利用序列化技术创建的一种简单数据库替代方案。虽然它可能不如传统的关系型数据库那样强大...

    Java实现序列化例子

    4. **序列化与深拷贝**:序列化也可以用于实现深拷贝,即创建一个与原始对象具有相同数据的新对象,但它们在内存中是独立的。 5. **优化序列化**:有时,对象可能包含大量数据,或者有复杂的引用结构,这可能导致...

    07-Java序列化面试题(10题)-新增.pdf

    除了在持久化对象时会用到对象序列化之外,当使用 RMI(远程方法调用),或在网络中传递对象时,都会用到对象序列化。Java 序列化 API 为处理对象序列化提供了一个标准机制,该 API 简单易用。 5. Serializable ...

    C#浅拷贝(MemberwiseClone等多种方法)与深拷贝(反射、多种反序列化)实例

    在C#编程中,对象的复制是一个常见的操作,主要分为浅拷贝和深拷贝两种。浅拷贝只复制对象的引用,而深...无论是通过`MemberwiseClone`、反射还是序列化/反序列化,选择正确的拷贝策略取决于你的具体需求和性能考虑。

    cereal序列化库及例程

    5. **反序列化**:从输入流(如`std::ifstream`)或内存缓冲区中创建`archive`对象,然后调用反序列化方法恢复数据。 **CerealTest.sln与CerealTest文件** 在提供的文件列表中,`CerealTest.sln`是一个Visual ...

    java中对象的序列化与反序列化深入讲解

    3. **深度克隆**:通过序列化和反序列化,可以实现对象的深拷贝,即创建一个与原对象完全相同的新对象,其内部状态与原对象一致,不受原对象后续修改的影响。 在实际使用中,需要注意的是,序列化可能会暴露对象的...

    可序列化接口Serializable

    序列化可以实现对象的深拷贝,即创建一个与原对象完全独立的新对象,修改拷贝不会影响原始对象。而浅拷贝仅复制对象引用,修改拷贝会影响原始对象。 **总结** `Serializable`接口在Java中扮演着至关重要的角色,它...

    ios-深拷贝对象.zip

    KNArchiveModel是一个常用的第三方库,它提供了一种简单的方式来序列化和反序列化Objective-C或Swift对象,包括深拷贝功能。使用这个库,开发者可以轻松地将对象转化为字节流(存储到磁盘或网络传输),然后在需要时...

    序列化(三) 实例分析深入了解序列化

    序列化和反序列化可以实现对象的深拷贝,即创建一个与原对象完全独立的新对象,包括其引用的所有子对象。 8. **序列化流的优化**: 通过实现`writeObject()`和`readObject()`方法,我们可以自定义序列化和反序列...

    浅谈C#中ListT对象的深度拷贝问题

    一、List对象中的T是值类型的情况(int 类型等) 对于值类型的List直接用以下方法就可以复制: List&lt;T&gt; oldList = new List(); oldList.Add(..); List&lt;T&gt; newList = new List(oldList); 二、List对象中的T是引用...

    Java对象(最后面是序列化的知识)1

    在反序列化过程中,有时需要验证对象的完整性,这可以通过`ObjectInputValidation`接口实现,注册验证器并在反序列化时执行验证方法。 总结来说,Java对象的生命周期涉及类加载、初始化,以及对象的创建、克隆、...

    C#中的浅拷贝和深拷贝

    然后,将当前对象序列化到 `MemoryStream` 中,接着重新定位到流的起始位置,最后从流中反序列化出一个新的对象,从而实现了深拷贝的效果。 总结来说,浅拷贝和深拷贝在不同的应用场景下有着不同的作用。浅拷贝通常...

    C++11 下使用 Boost.Serialization 库实现智能指针的序列化

    在C++编程中,序列化是一个重要的概念,它允许我们将对象的状态转换为可存储或可传输的数据格式,以便稍后能够恢复原始状态。Boost.Serialization库是C++社区广泛使用的序列化工具,它提供了丰富的功能来处理各种...

    C#基于表达式(Expression)实现对象深拷贝

    对于深拷贝,我们通常会利用序列化和反序列化的方法,但这可能会导致性能损失,尤其是在处理大型对象或循环引用时。而使用表达式树可以更高效地创建深拷贝,因为它允许我们在运行时动态生成代码,避免了序列化的开销...

    Java二进制序列化与克隆快速、高效、自动化.zip

    目录近期发布安装使用 Maven没有 Maven从源代码构建快速入门输入输出输出输入字节缓冲区不安全的缓冲区可变长度编码分块编码缓冲性能读写对象往返深拷贝和浅拷贝参考引用解析器参考限值语境重置序列化器框架登记类...

    kryo序列化jar包集合

    3. **对象共享**:Kryo支持对象引用的处理,能够在序列化和反序列化过程中保持对象间的引用关系,避免了深拷贝的额外开销。 4. **序列化配置**:Kryo提供了丰富的配置选项,如注册特定的序列化策略,控制序列化深度...

    详解JavaScript对象序列化

    在JavaScript中实现对象的深拷贝可以通过序列化和反序列化来完成。即将对象序列化为字符串,然后再将这个字符串反序列化为一个完全独立的对象副本。 除了JSON,还存在其他序列化格式,例如XML,但JSON以其简洁性...

    Netty之序列化协议

    序列化是指将对象的状态转换为可以存储或传输的形式的过程,而在反序列化时则可将这些数据恢复为原来的对象。在分布式系统和网络通信中,序列化是必不可少的,因为它允许对象在不同进程或计算机之间传递。Netty支持...

Global site tag (gtag.js) - Google Analytics