文档章节

关于Java对象深度Clone以及序列化与反序列化的使用

binhu
 binhu
发布于 2016/03/29 15:04
字数 690
阅读 50
收藏 5

        我们可以利用clone方法来实现对象只见的复制,但对于比较复杂的对象(比如对象中包含其他对象,其他对象又包含别的对象.....)这样我们必须进行层层深度clone,每个对象需要实现 cloneable接口,比较麻烦,那就继续学习下一个序列化方法。

创建

/*
 * 文 件 名: A.java 版 权: Unis Cloud Information Technology Co., Ltd. Copyright
 * 2015, All rights reserved 描 述: <描述> 修 改 人: Administrator 修改时间: 2015-11-10
 * 跟踪单号: <跟踪单号> 修改单号: <修改单号> 修改内容: <修改内容>
 */
package com.hubin.supers;

import java.io.Serializable;

/**
 * <一句话功能简述> <功能详细描述>
 * 
 * @author Administrator
 * @version [版本号, 2015-11-10]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class A implements Serializable {
    private String name;
    
    private int age;
    
    /**
     * @return 返回 name
     */
    public String getName() {
        return name;
    }
    
    /**
     * @param 对name进行赋值
     */
    public void setName(String name) {
        this.name = name;
    }
    
    /**
     * @return 返回 age
     */
    public int getAge() {
        return age;
    }
    
    /**
     * @param 对age进行赋值
     */
    public void setAge(int age) {
        this.age = age;
    }
      /**
     * @return
     */
    @Override
    public String toString() {
        return "A [name=" + name + ", age=" + age + "]";
    }
    
}

创建B类:

/*
 * 文 件 名: B.java 版 权: Unis Cloud Information Technology Co., Ltd. Copyright
 * 2015, All rights reserved 描 述: <描述> 修 改 人: Administrator 修改时间: 2015-11-10
 * 跟踪单号: <跟踪单号> 修改单号: <修改单号> 修改内容: <修改内容>
 */
package com.hubin.supers;

import java.io.Serializable;

/**
 * <一句话功能简述> <功能详细描述>
 * 
 * @author Administrator
 * @version [版本号, 2015-11-10]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class B implements Serializable {
    private A a;
    
    private String name;
    
    /**
     * @return 返回 a
     */
    public A getA() {
        return a;
    }
    
    /**
     * @param 对a进行赋值
     */
    public void setA(A a) {
        this.a = a;
    }
    
    /**
     * @return 返回 name
     */
    public String getName() {
        return name;
    }
    
    /**
     * @param 对name进行赋值
     */
    public void setName(String name) {
        this.name = name;
    }
    
    /**
     * @return
     */
    @Override
    public String toString() {
        return "B [a=" + a + ", name=" + name + "]";
    }
}

创建测试Desc类:

/*
 * 文 件 名: Desc.java 版 权: Unis Cloud Information Technology Co., Ltd. Copyright
 * 2015, All rights reserved 描 述: <描述> 修 改 人: Administrator 修改时间: 2015-11-10
 * 跟踪单号: <跟踪单号> 修改单号: <修改单号> 修改内容: <修改内容>
 */
package com.hubin.supers;

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

/**
 * 
 * @author Administrator
 * @version [版本号, 2015-11-10]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class Desc {
    public static void main(String[] args) throws Exception {
        A a = new A();
        a.setName("张三");
        a.setAge(10);
        B b = new B();
        b.setA(a);
        b.setName("南京");
        List<B> list = new ArrayList<B>();
        list.add(b);
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(byteOut);
        out.writeObject(list);
        ByteArrayInputStream byteIn = new ByteArrayInputStream(
                byteOut.toByteArray());
        ObjectInputStream in = new ObjectInputStream(byteIn);
        List<B> list1 = (List<B>) in.readObject();
        list1.get(0).getA().setName("李四");
        System.out.println(list.get(0));
        System.out.println(list1.get(0));
    }
}

结果:

B [a=A [name=张三, age=10], name=南京]

B [a=A [name=李四, age=10], name=南京]

从结果可以看到当修改序列化后的对象的值不会影响原先对象的值,所以可以通过序列化进行深度克隆


© 著作权归作者所有

共有 人打赏支持
上一篇: 安装Redis教程
下一篇: 搭建nginx
binhu
粉丝 18
博文 209
码字总数 205648
作品 0
合肥
私信 提问
为什么我墙裂建议大家使用枚举来实现单例。

关于单例模式,我的博客中有很多文章介绍过。作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单。因为在设计单例的时候要考虑很多问题,比如线程安全问题、序列化对单例的...

2018/06/10
0
0
Java中枚举的线程安全性及序列化问题

来源:微信公众号 ,原创: Hollis --枚举是如何保证线程安全的 要想看源码,首先得有一个类吧,那么枚举类型到底是什么类呢?是enum吗?答案很明显不是,enum就和class一样,只是一个关键字...

Java填坑之路
2018/08/02
0
0
Android Serializable与Parcelable原理与区别

一、序列化、反序列化是什么? (1) 名词解释 对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。 对象的反序列化:把字节序列恢复为Java对象的过程。 (2) 序列化详细解释 ...

KingMing
2015/04/16
0
0
Java拾遗:008 - 对象克隆与浅拷贝、深拷贝

对象克隆 Object类中有一个方法叫,完整代码 首先它是一个Native方法,而且是受保护的(),抛出一个异常(JDK1.8)。 通常程序员自己定义的类不能直接调用方法,如果要在外部调用,需要重写...

一别丶经年
2018/08/04
0
0
Serializable & Parcelable

对象序列化的简单介绍 所谓对象的序列化其实就是把JVM运行过程中生成的对象通过特殊的处理手段转换为字节形式的文件。转换之后就可以将其永久保存到磁盘中,或者以字节流进行网络传输。 在A...

吴七禁
2017/12/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Windows 上安装 Scala

在安装 Scala 之前需要先安装 Java 环境,具体安装的详细方法就不在这里描述了。 您可以自行搜索我们网站中的内容获得其他网站的帮助来获得如何安装 Java 环境的方法。 接下来,我们可以从 ...

honeymose
42分钟前
0
0
数据库篇多表操作

第1章 多表操作 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系...

stars永恒
今天
3
0
nginx日志自动切割

1.日志配置(Nginx 日志) access.log----记录哪些用户,哪些页面以及用户浏览器,IP等访问信息;error.log------记录服务器错误的日志 #配置日志存储路径:location / {      a...

em_aaron
昨天
5
0
java 反射

基本概念 RTTI,即Run-Time Type Identification,运行时类型识别。RTTI能在运行时就能够自动识别每个编译时已知的类型。   要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运...

细节探索者
昨天
2
0
推荐转载连接

https://www.cnblogs.com/ysocean/p/7409779.html#_label0

小橙子的曼曼
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部