Java编程思想:序列化深层部分
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编程思想:序列化深层部分的更多相关文章
- 《Java编程思想》读书笔记(二)
三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第一章到第十章的内容,这一次记录的是第 ...
- Java编程思想重点笔记(Java开发必看)
Java编程思想重点笔记(Java开发必看) Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...
- java编程思想
Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理 ...
- 《Java编程思想》读书笔记
前言 这个月一直没更新,就是一直在读这本<Java编程思想>,这本书可以在Java业界被传神的一本书,无论谁谈起这本书都说好,不管这个人是否真的读过这本书,都说啊,这本书很好.然后再看这边 ...
- JAVA编程思想读书笔记(四)--对象的克隆
接上篇JAVA编程思想读书笔记(三)--RTTI No1: 类的克隆 public class MyObject implements Cloneable { int i; public MyObje ...
- JAVA编程思想——分析阅读
需要源码.JDK1.6 .编码风格参考阿里java规约 7/12开始 有点意识到自己喜欢理论大而泛的模糊知识的学习,而不喜欢实践和细节的打磨,是因为粗心浮躁导致的么? cron表达式使用 设计能力.领 ...
- Java编程思想 笔记
date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...
- 《Java编程思想》读书笔记(三)
前言:三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十一章到第十六章的内容,这一次 ...
- 《Java编程思想》读书笔记(五)
前言:本文是<Java编程思想>读书笔记系列的最后一章,本章的内容很多,需要细读慢慢去理解,文中的示例最好在自己电脑上多运行几次,相关示例完整代码放在码云上了,码云地址:https://g ...
- JAVA编程思想(第四版)学习笔记----4.8 switch(知识点已更新)
switch语句和if-else语句不同,switch语句可以有多个可能的执行路径.在第四版java编程思想介绍switch语句的语法格式时写到: switch (integral-selector) ...
随机推荐
- CRS-2800: Cannot start resource 'ora.asm' as it is already in the INTERMEDIATE state on server ‘RAC02’
在安装ORACLE RAC的Grid Infrastructure时,在节点1运行/u01/app/11.2.0/grid/root.sh正常,当在节点2运行/u01/app/11.2.0/grid/ ...
- delphi程序向另一个可执行程序发消息(使用GetForegroundWindow; 找出当前操作系统中活动的第一个窗口)
function FindWindowThroughWindowText(WindowText: string): THandle;var hCurrentWindow: THandle; cnt ...
- 华为虚拟机结合VMware搭建环境测试snmp
最近在研究zabbix监控,在实际生产环节中,我们不单单是需要对linux主机进行监控还需要对网络设备防火墙等等进行监控,那么在linux主机上我们可以安装zabbix-agernt,但是在路由器交换 ...
- Bigtable:结构化数据的分布式存储系统
Bigtable最初是谷歌设计用来存储大规模结构化数据的分布式系统,其可以在数以千计的商用服务器上存储高达PB级别的数据量.开源社区根据Bigtable的设计思路开发了HBase.其优势在于提供了高效 ...
- [Erlang-0016][aque_tcp] 一个 Erlang TCP 组件
项目地址:https://github.com/liangjingyang/aque_tcp 欢迎任何形式的转载,但请务必注明出处:http://www.cnblogs.com/liangjingya ...
- Z Order of Controls in Delphi FireMonkey(Tom Yu的博客)
Get and set the Z Order of controls at runtime in Delphi FireMonkey. This is a follow on to my earli ...
- 怎样让窗口不显示在任务栏和ALT+TAB中(隐藏窗口再嵌套,几乎是万能的办法)
之前想弄个像QQ旋风那样的悬浮窗口,就研究了下怎么让窗口不显示在任务栏中,方法其实很简单就是将窗口的扩张属性设置成WS_EX_TOOLWINDOW,MSDN中对该属性有详细介绍,代码如下: ::Set ...
- 教你如何在 Visual Studio 2013 上使用 Github
介绍 我承认越是能将事情变简单的工具我越会更多地使用它.尽管我已经知道了足够的命令来使用Github,但我宁愿它被集成到IDE中.在本教程中,我会告诉你使用Visual Studio 2013如何实现 ...
- uni-app中vue组件父子值传递
一.父组件向子组件传递数据(props) <template> <view class="container" style="background: # ...
- Python连载15-高阶函数&map映射
一.高阶函数 1.定义:把函数作为参数使用的函数叫做高阶函数 (1)变量可以设置为赋值 a=100 b=a (2)函数名称就是一个变量 def FunA(): print("FunA()&q ...