Java基础教程——序列化
序列化
序列化:Serialize,将Java对象写入IO流(可以保存在数据库,文件等)
反序列化:Deserialize,从IO流中读取并恢复Java对象。
这么理解:序列化就是把对象封印起来,反序列化就是解封。
对象中包含的不仅仅是字符,更多的是非字符,因此需要使用字节流。
所有能在网上传输的对象的类都应该是可序列化的,否则程序就会出现异常。

实现Serializable接口
这个接口里面什么都没有,是一个标记接口,表明一个对象是可以序列化的。
public interface Serializable {
}
transient:瞬态关键字
|--transient变量---不参与序列化(有些变量可能属于敏感信息,如银行账户密码等)
transient:短暂的。
import java.io.*;
public class 序列化1 {
public static void main(String[] args) throws Exception {
int r_w = 3;
if (r_w == 1) {
on序列化();
} else if (r_w == 2) {
on反序列化();
} else {
on序列化();
on反序列化();
}
}
private static void on序列化() throws Exception {
Dog _d = new Dog("狗", "金毛");
File f = new File("myObj.txt");
System.out.println("序列化:" + f.getAbsolutePath());
FileOutputStream fos = new FileOutputStream(f);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(_d);
oos.close();
fos.close();
}
private static void on反序列化() throws Exception {
// 前提:1.类必须可序列化,2.必须有对应的类文件
File f = new File("myObj.txt");
FileInputStream fis = new FileInputStream(f);
ObjectInputStream ois = new ObjectInputStream(fis);
Dog d = (Dog) ois.readObject();
System.out.println("反序列化:" + d + ": name = " + d.name);
ois.close();
fis.close();
}
}
class Dog implements Serializable {
private static final long serialVersionUID = 1L;
public Dog(String name, String type) {
super();
this.name = name;
this.type = type;
}
String name;
transient String type;
@Override
public String toString() {
System.out.println("type:没参与序列化");
return "【狗狗:name = " + name + ", type = " + type + "】";
}
}
运行结果:
序列化:C:\Users\Administrator\git\Ah01JspJavaHtml\myObj.txt
type:没参与序列化
反序列化:【狗狗:name = 狗, type = null】: name = 狗
序列号: serialVersionUID
|--修改类的定义,可能生成新的序列号
|--|--改构造器:变
|--|--改字段:变(包括transient字段)
|--|--改方法体里的实现,不变;
序列化和反序列化时的序列号如果不同,会抛出异常java.io.InvalidClassException
可以显示声明一个固定的序列号。如:
private static final long serialVersionUID = 1L;
*另一种序列化方法:实现Externalizable接口
Externalizable接口可以替代Serializable接口。
需要手提供一个无参构造方法,否则在反序列化的时候会抛出异常
java.io.InvalidClassException: ……; no valid constructor
同时还需要定义两个方法(writeExternal()和readExternal())来控制要序列化的字段。
下列示例,只有Dog类的实现和上例不一样,其余代码可以一样。
package ah.externalizable;
import java.io.*;
public class 序列化2 {
public static void main(String[] args) throws Exception {
on序列化();
on反序列化();
}
private static void on序列化() throws Exception {
Dog _d = new Dog("狗", "金毛");
File f = new File("myObj.txt");
System.out.println(f.getAbsolutePath());
FileOutputStream fos = new FileOutputStream(f);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(_d);
oos.close();
fos.close();
}
private static void on反序列化() throws Exception {
File f = new File("myObj.txt");
FileInputStream fis = new FileInputStream(f);
ObjectInputStream ois = new ObjectInputStream(fis);
Dog d = (Dog) ois.readObject();
System.out.println(d + ": name = " + d.name);
ois.close();
fis.close();
}
}
class Dog implements Externalizable {
public Dog() {
// 不写空构造,读不出来(可以写)
}
public Dog(String name, String type) {
super();
this.name = name;
this.type = type;
}
String name;
String type;
@Override
public void writeExternal(ObjectOutput out) throws IOException {
// 不写的Field就不序列化
out.writeUTF(name);
out.writeUTF(type);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
// 读取顺序务必和写入顺序相同
name = in.readUTF();
type = in.readUTF();
}
@Override
public String toString() {
return "【狗狗:" + name + ", 是一只" + type + "】";
}
}
Java基础教程——序列化的更多相关文章
- Java基础教程:面向对象编程[2]
Java基础教程:面向对象编程[2] 内容大纲 访问修饰符 四种访问修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java 支持 4 种不同的访问权限. default ...
- Java基础教程(25)--I/O
一.I/O流 I/O流表示输入源或输出目标.流可以表示许多不同类型的源和目标,例如磁盘文件.设备.其他程序等. 流支持许多不同类型的数据,包括字节.原始数据类型.字符和对象等.有些流只传递数据 ...
- Java基础教程(18)--继承
一.继承的概念 继承是面向对象中一个非常重要的概念,使用继承可以从逻辑和层次上更好地组织代码,大大提高代码的复用性.在Java中,继承可以使得子类具有父类的属性和方法或者重新定义.追加属性和方法. ...
- Java基础教程(12)--深入理解类
一.方法的返回值 当我们在程序中调用方法时,虚拟机将会跳转到对应的方法中去执行.当以下几种情况发生时,虚拟机将会回到调用方法的语句并继续向下执行: 执行完方法中所有的语句: 遇到return语句: ...
- Java基础教程:注解
Java基础教程:注解 本篇文章参考的相关资料链接: 维基百科:https://zh.wikipedia.org/wiki/Java%E6%B3%A8%E8%A7%A3 注解基础与高级应用:http: ...
- Java基础教程:网络编程
Java基础教程:网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个s ...
- Java基础教程(5)--变量
一.变量 1.变量的定义 正如上一篇教程<Java基础教程(4)--面向对象概念>中介绍的那样,对象将它的状态存在域中.但是你可能仍然有一些疑问,例如:命名一个域的规则和惯例是什么?除 ...
- Java基础教程:Lambda表达式
Java基础教程:Lambda表达式 本文部分内容引用自OneAPM:http://blog.oneapm.com/apm-tech/226.html 引入Lambda Java 是一流的面向对象语言 ...
- Java基础教程:泛型基础
Java基础教程:泛型基础 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚 ...
随机推荐
- exe打包成安装文件(界面美观)
前言 在开发windows桌面应用过程中,软件交付时,一般都是交付安装包. 安装文件的优点 显得更正规,安装界面也可展示软件特点介绍,可自动生成桌面图标等: 安装包体积要比软件小,方便下载. 探索之路 ...
- Java8新特性探索之函数式接口
一.为什么引入函数式接口 作为Java函数式编程爱好者,我们都知道方法引用和 Lambda 表达式都必须被赋值,同时赋值需要类型信息才能使编译器保证类型的正确性. 我们先看一个Lambda代码示例: ...
- 4G DTU是什么 可以应用于哪些行业?
4G是什么? 4G是移动电话网络通过蜂窝塔传输的信号的名称,蜂窝塔连接到更宽的互联网.这些是当今智能手机使用的信号,当您外出时,可以通过手机上网,因此他们不依赖电缆或光纤,也就是说无线网. 使用合适的 ...
- 监控制图OxyPlot组件的下载与安装
1.在工具(T)-NuGet包管理器(N)-管理解决方案的NuGet程序包(N),打开组件管理界面 2.切换到浏览窗口,安装以下三个窗口组件即可 3.OxyPlot文档手册 https://oxypl ...
- FastCGI协议分析
不知道什么时候,就开始有了让HomeServer支持PHP的念头.于是分析起了FastCGI协议.FastCGI用于WebServer与WebApplication之间的通讯,例如Apache与PHP ...
- node转发请求 .csv格式文件下载 中文乱码问题 + 文件上传笔记
用户无法直接访问后台接口 需要node端转发请求 并将数据以.csv文件格式生成以供客户端下载. 很不幸出现了中文乱码的问题 挖了各种坟帖,下了各种依赖包,csv.json2csv.bufferHel ...
- php数据映射到echarts中国地图
echarts和php结合 根据php后台数据,映射到地图上所有的省份,地图市下钻的形式,每次下钻到新地图不合并(合并缩放的话会导致下钻地图位置找不到了),添加了自定义工具栏里面的返回到顶级下钻地图 ...
- Python基本数据类型与数据结构(数据挖掘学习)
前言 最近工作和研究涉及到数据挖掘和机器学习,出于归纳和总结知识的目的写下这一系列的文章,这一系列文章将会包括Python的基本数据类型和数据结构,函数和面向对象相关的知识,然后会介绍数据挖掘和机器学 ...
- 聊一聊sockmap 以及ebpf
之前聊过tcpdump 抓包原理,tcpdump使用packet 抓包,使用packet_map 完成零拷贝.但是这个零拷贝也有点假,何为假呢?从网卡到内存走的dma,哪能不能直接从dma拷贝到用户空 ...
- 使用spring框架进行aop编程实现方法调用前日志输出
aop编程 之使用spring框架实现方法调用前日志输出 使用spring框架实现AOP编程首先需要搭建spring框架环境: 使用Spring框架实现AOP工程编程之后,不需要我们去写代理工厂了,工 ...