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 ...
随机推荐
- 使用IntelliJ IDEA开发SpringMVC网站(四)用户管理
原文:使用IntelliJ IDEA开发SpringMVC网站(四)用户管理 摘要 通过对用户表的管理,更加深入地讲解SpringMVC的操作. 目录[-] 文章已针对IDEA 15做了一定的更新,部 ...
- Qt:移动无边框窗体(使用Windows的SendMessage)
移动无边框窗体的代码网上很多,其原理都是一样的,但是是有问题的,我这里只是对其修正一下 网上的代码仅仅实现了两个事件 void EditDialog::mousePressEvent(QMouseEv ...
- JavaWeb实现上传文件
需要 commons-io与commons-fileupload 首先在jsp中创建一下布局 <%@ page contentType="text/html;charset=UTF-8 ...
- Qt 不规则窗体 – 鼠标点击穿透(Linux也可以,有对x11的配置的方法)
之前写过如何用 Qt 现成的方法写出无边框半透明的不规则窗体:<Qt 不规则窗体 – 无边框半透明> 其实有一个很特殊的窗体属性一直以来都伴随着不规则窗体出现,这就是本文要介绍的鼠标点击穿 ...
- 前端开发在uc浏览器上遇到的坑
关于uc 的flex 和textarea 的width:100%: 这些天再做一个wap的项目,本想着手机上不用考虑兼容性问题,可以大刀阔斧搞,fuck ie678! 在pc上完成页面开发,在chro ...
- 基于ASP.NET的新闻管理系统(三)代码展示
5.1.1栏目部分 增加栏目(addLanMu.aspx): <html xmlns="http://www.w3.org/1999/xhtml"> <head ...
- Matlab与.Net混合编程-多维数组赋值出错的问题
问题描述:Matlab可编译供.net调用的dll.两种不同环境对数据类型的定义相差较大,因此在C#中调用Matlab编译的函数时,首先要将C#中的变量类型转换成与Matlab对应的中转类型.Matl ...
- PHP中关于时间、时区、本地时间、UTC时间、GMT时间、时间戳等知识的梳理
在PHP开发中,我们经常会在时间问题上被搞糊涂,比如我们希望显示一个北京时间,但是当我们使用date函数进行输出时,却发现少了8个小时.几乎所有的php猿类都必须对php中几个重要的时间转换等方法进行 ...
- JavaWEB路径总结
这篇文章是小编一直想写的一篇,主要是对web阶段中各个路径进行的一些总结,希望读者看过之后对于路径方面有一个清晰的认识.首先声明一点:世界上一切东西都是相对的,对于这点而言,相信大家并不陌生,从初中开 ...
- 我整理的一份来自于线上的Nginx配置(Nginx.conf),希望对学习Nginx的有帮助
我整理了一份Nginx的配置文件说明,是真正经历过正式线上考验过.如果有优化的地方,也请朋友们指点一二,整理出一份比较全而实用的配置. 主要包含配置:负载均衡配置,页面重定向,转发,HTTPS和HTT ...