Java编程思想:序列化基础部分
import java.io.*; import java.util.Date; import java.util.Random; public class Test { public static void main(String[] args){ // Worm.test(); // Blip.test(); // Login.test(); SerialCtl.test(); } } class Data implements Serializable { private int n; public Data(int n) { this.n = n; } public String toString() { return Integer.toString(n); } } class Worm implements Serializable { private static final int SIZE = 1024; private static Random random = new Random(47); private Data[] datas = new Data[]{ new Data(random.nextInt(10)), new Data(random.nextInt(10)), new Data(random.nextInt(10)) }; private Worm next; private char c; public Worm(int i, char c) { System.out.println("Worm Constructor: " + i); this.c=c; if (--i > 0) { next=new Worm(i,(char)(c+1)); } } public Worm() { System.out.println("Default Constructor"); } public String toString() { StringBuilder sb = new StringBuilder(":"); sb.append("c"); sb.append("("); for (Data data : datas) { sb.append(data); } sb.append(")"); if (next != null) { sb.append(next); } return sb.toString(); } public static void test() { try{ Worm w = new Worm(6, 'a'); System.out.println("w = "+w); /* //创建ObjectOutputStream用于储存序列化结果 ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("worm.out")); out.writeObject("Worm Storage\n"); out.writeObject(w); out.close(); //创建ObjectInputStream用于读取序列化数据 ObjectInputStream in = new ObjectInputStream( new FileInputStream("worm.out")); //从序列化数据恢复时,需要按照序列化顺序 String s = (String)in.readObject(); Worm w2 = (Worm)in.readObject(); System.out.println(s+"w2 = "+w); */ //测试,将序列化数据储存在ByteArrayOutputStream中 //这个地方这样写,不便于后面操作 /* ObjectOutputStream out2 = new ObjectOutputStream( new ByteArrayOutputStream()); */ ByteArrayOutputStream bs = new ByteArrayOutputStream(); ObjectOutputStream out2 = new ObjectOutputStream(bs); out2.writeObject("Worm Storage In Bytes...\n"); out2.writeObject(w); out2.flush(); ObjectInputStream in2 = new ObjectInputStream( new ByteArrayInputStream(bs.toByteArray())); String s2 = (String)in2.readObject(); Worm w3 = (Worm)in2.readObject(); System.out.println(s2 + "w3 = "+w3); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } /* Serializable序列化时,对象完全以它存储的二进制为为基础来构造,而不调用构造器 Externnlizable序列化时,所有普通的默认构造器都会被调用(包括字段定义时的初始 化),然后调用readExternal() */ class Blip implements Externalizable { private int i; private String s; public Blip() { System.out.println("Constructor: Blip()"); } public Blip(String s, int i) { System.out.println("Constructor: Blip(String s, int i)"); this.s=s; this.i=i; } public String toString() { return s + i; } @Override public void writeExternal(ObjectOutput out) throws IOException { System.out.println("Blip.writeExternal..."); out.writeObject(s); //这个地方写了一个BUG,用Object会造成自动装箱,导致readInt()读不出来结果 //out.writeObject(i); out.writeInt(i); } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { System.out.println("Blip.readExternal..."); this.s = (String)in.readObject(); this.i = in.readInt(); } public static void test() { try{ Blip b = new Blip("A String...", 47); System.out.println(b); //创建输出流 ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("Blip.out")); out.writeObject(b); out.close(); //创建输入流 ObjectInputStream in = new ObjectInputStream( new FileInputStream("Blip.out")); Blip b2 = (Blip)in.readObject(); System.out.println(b2); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } /* 测试 Transient关键字 */ class Login implements Serializable { private Date date = new Date(); private String username; private transient String password; public Login(String name, String password) { this.username = name; this.password=password; } public String toString() { return "Login info:"+ "\n username:"+username+ "\n password:"+password+ "\n date:"+date; } public static void test() { try{ Login l = new Login("zhangshan", "123456"); System.out.println("Login l = "+l); //创建输出流 ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("login.out")); out.writeObject(l); //创建输入流 ObjectInputStream in = new ObjectInputStream( new FileInputStream("login.out")); Login m = (Login)in.readObject(); System.out.println("Login m = "+m); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } /* Externalizable的替代方案,非常混乱的一个方案,没有研究的价值 */ class SerialCtl implements Serializable { private String username; private transient String password; public SerialCtl(String name, String password) { this.username=name; this.password=password; } public String toString() { return username+"\n"+password; } private void writeObject(ObjectOutputStream outputStream) throws IOException{ outputStream.defaultWriteObject(); outputStream.writeObject(password); } private void readObject(ObjectInputStream inputStream) throws IOException,ClassNotFoundException{ inputStream.defaultReadObject(); password=(String)inputStream.readObject(); } public static void test() { SerialCtl sc = new SerialCtl("Test1", "Test2"); System.out.println("Before:\n"+sc); try{ //创建输出流 ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("SerialCtl.out")); out.writeObject(sc); //创建输入流 ObjectInputStream in = new ObjectInputStream( new FileInputStream("SerialCtl.out")); SerialCtl sc2 = (SerialCtl)in.readObject(); System.out.println("Now:\n"+sc2); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
Java编程思想:序列化基础部分的更多相关文章
- 《java编程思想》--多线程基础--Runnable
一.简单说下Runnable是什么 1.它是一个接口 2.只提供了run方法 3.这个接口提供了一个协议:实现这个接口的类是active的(不必成为Thread的子类) 4.run方法没有返回值 /* ...
- java编程思想-基础
interface: 方法默认为public:成员变量默认 static and final 对象数组的定义:理解? 多接口继承:可以多个接口,但只有一个具体类,具体类在前面 自:多接口继承时,来自不 ...
- 《Java编程思想》读书笔记
前言 这个月一直没更新,就是一直在读这本<Java编程思想>,这本书可以在Java业界被传神的一本书,无论谁谈起这本书都说好,不管这个人是否真的读过这本书,都说啊,这本书很好.然后再看这边 ...
- Java编程思想 笔记
date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...
- 《Java编程思想》读书笔记(二)
三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第一章到第十章的内容,这一次记录的是第 ...
- 《Java编程思想》读书笔记(三)
前言:三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十一章到第十六章的内容,这一次 ...
- 《Java编程思想》读书笔记(五)
前言:本文是<Java编程思想>读书笔记系列的最后一章,本章的内容很多,需要细读慢慢去理解,文中的示例最好在自己电脑上多运行几次,相关示例完整代码放在码云上了,码云地址:https://g ...
- JAVA编程思想(第四版)学习笔记----4.8 switch(知识点已更新)
switch语句和if-else语句不同,switch语句可以有多个可能的执行路径.在第四版java编程思想介绍switch语句的语法格式时写到: switch (integral-selector) ...
- Java编程思想重点笔记(Java开发必看)
Java编程思想重点笔记(Java开发必看) Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...
- 《java编程思想》读书笔记(一)开篇&第五章(1)
2017 ---新篇章 今天终于找到阅读<java编程思想>这本书方法了,表示打开了一个新世界. 第一章:对象导论 内容不多但也有20页,主要是对整本书的一个概括.因为已经有过完整JAV ...
随机推荐
- 编译时MSIL注入--实践Mono Cecil(1)
原文:编译时MSIL注入--实践Mono Cecil(1) 紧接上两篇浅谈.NET编译时注入(C#-->IL)和浅谈VS编译自定义编译任务—MSBuild Task(csproject),在第一 ...
- UWP入门(一) -- 先写几个简单控件简单熟悉下(别看这个)
原文:UWP入门(一) -- 先写几个简单控件简单熟悉下(别看这个) 1. MainPage.xmal <Grid Background="{ThemeResource Applica ...
- 开源libco库:单机千万连接、支撑微信8亿用户的后台框架基石
微信于2013年开源的ibco库,是微信后台大规模使用的c/c++协程库,2013年至今稳定运行在微信后台的数万台机器上.libco在2013年的时候作为腾讯六大开源项目首次开源,ibco支持后台敏捷 ...
- jquery 之load post get
load() 方法从服务器加载数据,并把返回的数据放入被选元素中 load(url,data,fun(responseTxt ,responseTxt,xhr ){}) 必需的 URL 参数规定您希望 ...
- 基于ASP.NET的新闻管理系统(三)代码展示
5.1.1栏目部分 增加栏目(addLanMu.aspx): <html xmlns="http://www.w3.org/1999/xhtml"> <head ...
- 管理python虚拟环境的工具virtuelenvwrapper
virtuelenvwrapper出现的原因 virtualenv 的一个最大的缺点就是: 每次开启虚拟环境之前要去虚拟环境所在目录下的 bin 目录下 source 一下 activate,这就 ...
- spring常见十大异常
一.找不到配置文件的异常 [plain] view plaincopy org.springframework.beans.factory.BeanDefinitionStoreException: ...
- Zookeeper详解-安装(四)
ZooKeeper服务器是用Java创建的,它在JVM上运行.你需要使用JDK 6或更高版本. 步骤1:验证Java安装 相信你已经在系统上安装了Java环境.现在只需使用以下命令验证它. $ jav ...
- pytorch实现yolov3(3) 实现forward
之前的文章里https://www.cnblogs.com/sdu20112013/p/11099244.html实现了网络的各个layer. 本篇来实现网络的forward的过程. 定义网络 cla ...
- SpringBoot 缓存注解 与EhCache的使用
在SpringBoot工程中配置EhCache缓存 1.在src/main/resources下新建ehcache.xml文件 eternal=true //缓存永久有效,false相反 maxEle ...