import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args){
//        MyWorld.test();
        ATest.test();
    }
}

/*
    只要把任何对象序列化到单一的流中,就可以恢复出与我们写时一样的对象网,并且没有任何
    意外重复复制的对象。
 */

class House implements Serializable {
    //
}

class Animal implements Serializable {
    private String name;
    private House house;

    public Animal(String name, House house) {
        this.name=name;
        this.house=house;
    }

    public String toString() {
        return name+" ["+house+"] ";
    }
}

class MyWorld {
    public static void test() {
        try {
            /*
                问题:
                    1.animals中每个animal都使用同一个house,序列化时,house会不会被序列多个
             */
            House house = new House();
            List<Animal> animals = new ArrayList<>();
            animals.add(new Animal("A", house));
            animals.add(new Animal("B", house));
            animals.add(new Animal("C", house));

            System.out.println("animals:" + animals);

            //创建输出流
            ByteArrayOutputStream bstream = new ByteArrayOutputStream();
            ObjectOutputStream out1 = new ObjectOutputStream(bstream);
            out1.writeObject(animals);
            out1.writeObject(animals);
            out1.flush();

            ByteArrayOutputStream bstream2 = new ByteArrayOutputStream();
            ObjectOutputStream out2 = new ObjectOutputStream(bstream2);
            out2.writeObject(animals);
            out2.flush();

            //创建输入流
            ObjectInputStream in1 = new ObjectInputStream(
                    new ByteArrayInputStream(bstream.toByteArray()));
            ObjectInputStream in2 = new ObjectInputStream(
                    new ByteArrayInputStream(bstream2.toByteArray()));

            List
                    animals1 = (List)in1.readObject(),
                    animals2 = (List)in1.readObject(),
                    animals3 = (List)in2.readObject();

            System.out.println("animals1:" + animals1);
            System.out.println("animals2:" + animals2);
            System.out.println("animals3:" + animals3);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

/*
    问题:
        书中说,我们写出第一个对象和写出最后一个对象期间改变了这些对象的状态,但是又说
        只要我们序列化到同一个流中,就能恢复和写时一样的对象网。问题是,如果一个对象我
        第一写入时是x值,我改变了这个值为y,又写一次,那我恢复时,得到的对象的值是多少
        呢?

    输出结果:
        a1.a: 10
        a2.a: 10
        a1:A@568db2f2
        a2:A@568db2f2

    分析:
        我不知道这是为什么哦,感觉很奇怪,第二次的操作跟没操作一样的
 */
class A implements Serializable{
    private int a;

    public A(int a) {
        this.a = a;
    }

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }
}

class ATest{
    public static void test() {
        A a = new A(10);

        try{

            //创建输出流
            ByteArrayOutputStream bstream = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(bstream);
            out.writeObject(a);

            //改变a的值
            a.setA(100);
            //再次写入
            out.writeObject(a);

            out.flush();

            //创建输入流
            ObjectInputStream in = new ObjectInputStream(
                    new ByteArrayInputStream(bstream.toByteArray()));

            A a1 = (A)in.readObject();
            A a2 = (A)in.readObject();

            System.out.println("a1.a: "+a1.getA());
            System.out.println("a2.a: "+a2.getA());
            System.out.println("a1:"+a1);
            System.out.println("a2:"+a2);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }
}

/*
    如果我们想保存状态,最安全的做法是将其作为“原子”操作进行序列化。如果我们
    序列化了某些东西,再去做其他的一些工作,再来序列化更多的东西,如此等等,
    那么将无法安全的保存系统状态。取而代之的是,将构成系统状态的所有对象都置
    入单一容器内,并在一个操作中将该容器直接写出。然后同样只需要一次方法调用
    ,即可以恢复状态
 */

Java编程思想:序列化深层部分的更多相关文章

  1. 《Java编程思想》读书笔记(二)

    三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第一章到第十章的内容,这一次记录的是第 ...

  2. Java编程思想重点笔记(Java开发必看)

    Java编程思想重点笔记(Java开发必看)   Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...

  3. java编程思想

    Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理 ...

  4. 《Java编程思想》读书笔记

    前言 这个月一直没更新,就是一直在读这本<Java编程思想>,这本书可以在Java业界被传神的一本书,无论谁谈起这本书都说好,不管这个人是否真的读过这本书,都说啊,这本书很好.然后再看这边 ...

  5. JAVA编程思想读书笔记(四)--对象的克隆

    接上篇JAVA编程思想读书笔记(三)--RTTI No1: 类的克隆 public class MyObject implements Cloneable { int i; public MyObje ...

  6. JAVA编程思想——分析阅读

    需要源码.JDK1.6 .编码风格参考阿里java规约 7/12开始 有点意识到自己喜欢理论大而泛的模糊知识的学习,而不喜欢实践和细节的打磨,是因为粗心浮躁导致的么? cron表达式使用 设计能力.领 ...

  7. Java编程思想 笔记

    date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...

  8. 《Java编程思想》读书笔记(三)

    前言:三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十一章到第十六章的内容,这一次 ...

  9. 《Java编程思想》读书笔记(五)

    前言:本文是<Java编程思想>读书笔记系列的最后一章,本章的内容很多,需要细读慢慢去理解,文中的示例最好在自己电脑上多运行几次,相关示例完整代码放在码云上了,码云地址:https://g ...

  10. JAVA编程思想(第四版)学习笔记----4.8 switch(知识点已更新)

    switch语句和if-else语句不同,switch语句可以有多个可能的执行路径.在第四版java编程思想介绍switch语句的语法格式时写到: switch (integral-selector) ...

随机推荐

  1. 无法删除 NTFS 盘上的文件或文件夹(对Windows文件的各种情况有比较详细的描述)

    简介 本文介绍您可能无法删除 NTFS 文件系统卷上的文件或文件夹的原因,以及如何分析造成此问题的不同原因从而解决此问题. 更多信息 注意:在内部,NTFS 将文件夹作为特殊类型的文件进行处理.因此, ...

  2. 处理 Windows Phone 应用中的“后退”按钮 (XAML)

    与电脑不同,所有 Windows Phone 设备都有“后退”按钮,它允许用户在应用的页面之间向后导航.如果用户在转到应用的第一页时再次按“后退”按钮,操作系统会挂起你的应用并将用户导航到应用启动前的 ...

  3. 使用Boost的DLL库管理动态链接库(类似于Qt中的QLibrary)

    Boost 1.61新增了一个DLL库,跟Qt中的QLibrary类似,提供了跨平台的动态库链接库加载.调用等功能.http://www.boost.org/users/history/version ...

  4. ML:梯度下降(Gradient Descent)

    现在我们有了假设函数和评价假设准确性的方法,现在我们需要确定假设函数中的参数了,这就是梯度下降(gradient descent)的用武之地. 梯度下降算法 不断重复以下步骤,直到收敛(repeat ...

  5. Redis 高可用之哨兵模式

    参考   : https://mp.weixin.qq.com/s/Z-PyNgiqYrm0ZYg0r6MVeQ 一.redis高可用解决方案 redis主从 优点:1.高可靠性,主从实时备份,有效解 ...

  6. 新兴技术袭来,Web开发如何抉择?

    土豆网同步更新:http://www.tudou.com/plcover/VHNh6ZopQ4E/   使用HTML 创建Mac OS App 视频教程. 官方QQ群: (1)App实践出真知 434 ...

  7. 静态编译 Qt 5.6

    源码下载 Qt git地址:git://code.qt.io/qt/qt5.git 推荐用 SourceTree 客户端来克隆源码 准备工作 系统 Windows 7 或者 Windows 10 编译 ...

  8. Color gradient in Delphi FireMonkey

    Introduction to color gradients in Delphi FireMonkey. Video This video covers the basics of color gr ...

  9. spring cloud之eureka简介

    最近线上的接口出了一些问题,有一些可能不是代码的问题,但是由于是测试和其他方面的同事爆出来的,所以感觉对接口的监控应该提上日程. 经过搜索发现,spring cloud的eureka就是专门做这方面工 ...

  10. vim 列编辑模式

    vim 列编辑模式 标签: vim 视窗模式 列编辑模式 vim 列编辑模式 例子:给列批量添加前缀.后缀.修改字段 vim 列编辑模式 vim 有三种编辑模式,命令模式.输入模式.视窗模式,我们常用 ...