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. SQLServer 进程无法向表进行大容量复制(错误号: 22018 20253)

    原文:SQLServer 进程无法向表进行大容量复制 我的环境:SQL SERVER 2008 R2:发布者 ->SQL SERVER 2017 订阅者 进程无法向表“"dbo&quo ...

  2. .Net DateTime跨时区相关问题

    项目:.Net CS结构,WCF通信,MySql存储. 场景:客户端(UTC+07:00)获取本地时间(DateTime对象)2017-01-17 15:20:12,通过WCF(http)传输至服务端 ...

  3. Android零基础入门第50节:StackView卡片堆叠

    原文:Android零基础入门第50节:StackView卡片堆叠 上一期学习了AdapterViewFilpper的使用,你已经掌握了吗?本期开始学习StackView的使用. 一.认识StackV ...

  4. 树莓派 Qt5.7交叉编译

    一.准备软件    1.2016-11-25-raspbian-jessie.img(官网下载)    2.cross-compile-tools-master.zip    3.gcc-4.7-li ...

  5. Qt设置窗体的透明度: setWindowOpacity

    在Qt中,设置窗体透明度的函数有:void   setWindowOpacity(qreal level)   特性: 透明度的有效范围从1.0(完全不透明)到0.0(完全透明的). 默认情况下,此属 ...

  6. LOG4NET图文教程

    LOG4NET教程 一:简介 从操作系统到大多数的大型软件,都会有自己的程序运行时的日志跟踪API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而软件开发人员需要一套强大的日志系统来记 ...

  7. Codility---PermCheck

    Task description A non-empty zero-indexed array A consisting of N integers is given. A permutation i ...

  8. PHP调用语音合成接口

    百度TTS 语音合成 //百度文件转换成语音 private function toSpeech($text) { define('DEMO_CURL_VERBOSE', false); $obj=[ ...

  9. 30212Java_数组

    数组 1.综述 数组是相同类型数据的有序集合.数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成. 其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们. 数组的三个 ...

  10. 记一次在win2008下添加nginx自启动服务的操作

    为了在win环境下添加nginx自启服务,我度娘了, 找到在cnblogs下(http://www.cnblogs.com/JayK/p/3429795.html)有篇文章是介绍如何添加nginx到w ...