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. java的clone()、浅拷贝与深拷贝

    clone()方法是Object的native方法.protected native Object clone() throws CloneNotSupportedException;  声明为pro ...

  2. SignalR的简单实现(一)

    原文:SignalR的简单实现(一) ASP.NET SignalR是ASP.NET开发人员的一个新库,它使您的应用程序添加实时Web功能变得非常简单.什么是"实时网络"功能?能够 ...

  3. 一小部分机器学习算法小结: 优化算法、逻辑回归、支持向量机、决策树、集成算法、Word2Vec等

    优化算法 先导知识:泰勒公式 \[ f(x)=\sum_{n=0}^{\infty}\frac{f^{(n)}(x_0)}{n!}(x-x_0)^n \] 一阶泰勒展开: \[ f(x)\approx ...

  4. 界面美化.CStatic控件的美化(好多系列文章)

    http://www.cnblogs.com/20090802/archive/2010/09/17/1829283.html 静态控件也是比较常用的控件,在VS开发环境中用的应该挺频繁的吧. 其实m ...

  5. Qt5.4.2Mingw编译配置opencv2.4.9

    1 下载所需工具 (1)qt-opensource-windows-x86-mingw491_opengl-5.4.2.exe  842M 下载地址https://download.qt.io/arc ...

  6. 开源|性能优化利器:数据库审核平台Themis的选型与实践

    作者:韩锋 出处:DBAplus社群分享:来源:宜信技术学院 Themis开源地址:https://github.com/CreditEaseDBA 一.面临的挑战 1.运维规模及种类 我相信,这也是 ...

  7. 一道经典的js面试题

    # 声明:学习编程语言最好的方式就是通过实例学习 ## 下面是我在博客上看到的一道js面试题,可以说非常经典,下面会以最简单的方式让你理解题目:```bashfunction Foo() { getN ...

  8. ORACLE(系统表emp) 基本与深入学习

    (一).首先我们先创建emp表(系统有的可以跳过往下看)没有直接复制运行即可.create table DEPT( deptno NUMBER(2) not null, dname VARCHAR2( ...

  9. hgoi#20190516

    T1-Buying A House 给你一个长度为n的序列a,给你目标房子m,最多花的钱k 如果a[i]为0,这座房子无法购买,否则可以购买,求能买的距离目标房子最近的房子,输出最小距离 两座房子之间 ...

  10. Markdown教程 <1>

    Markdown教程 <1> 本文在本地使用atom编辑后,直接将代码赋值到博客园中的markdown编辑器中生成 1. markdown字体,段落控制 以下引用块里面为源码,引用块下方为 ...