java基础序--列化和反序列化
一、什么是序列化和反序列化:
序列化:是指把java堆内存中的对象转换成字节(二进制流)的过程。也就是通过某种方式将java对象存储在磁盘内存中,这个过程称为序列化
反序列化:是把磁盘上的对象转恢复成java对象的过程。
二、序列化和反序列化优点:
1、分布式系统中,需要把对象在网络传输,需要将对象转换成二进制流形式,需要共享的javabean对象都需要进行序列化。
2、服务器钝化,服务器发现某些对象好久没有活动,服务器就会将某些对象存储在本地内存中,需要的时候去内存中寻找,然后反序列化成java对象,节省服务器内存。
总结:①、实现了数据的持久化,通过序列化保存在本地硬盘上。②、利用序列化实现了远程通信。
三、序列化的必要条件:
1、需要实现Java.lang.Serializable 接口,java中大多类都实现类改接口。例:String Integer
2、断层会判断,当前对象是 Serializable 的实例,才允许做序列化,Java对象 instanceof Serializable 来判断
3、jdk中的api:
ObjectOutputStream 中的 writeObject() 方法进行序列化操作
ObjectInputStream 中的readObject() 方法进行反序列化操作
javabean 如果不实现 java.io.Serializable 接口
demo:
package com.liuxn.Serialization.javaBean; import java.io.Serializable; /**
* Created by Administrator on 2018/6/13.
* 创建一个javabean 实现 Serializable 接口
*/
public class User implements Serializable { //需要进行序列化的字段
private String name; private int age; transient private String className;//不需要进行序列化的字段 public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public String getClassName() {
return className;
} public void setClassName(String className) {
this.className = className;
} public void setAge(int age) {
this.age = age;
} // public User(String name, int age) {
// this.name = name;
// this.age = age;
// }
//
//
// public User() {
// } @Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", className='" + className + '\'' +
'}';
}
}
package com.liuxn.Serialization.test; import com.liuxn.Serialization.javaBean.User; import java.io.*; /**
* Created by Administrator on 2018/6/13.
*
* 用于测试序列化和反序列化 测试类
*/
public class TestSerialization { public static void main(String[] args) {
/**
* 使用ObjectOutputStream实现序列化
*/
User user = new User();
user.setAge(10);
user.setName("小明");
System.out.println(user); ObjectOutputStream oos = null;
try {
OutputStream op = new FileOutputStream("F:\\360WiFi"+ File.separator+"a.txt");
oos = new ObjectOutputStream(op);
oos.writeObject(user);
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
/**
* ObjectInputStream 实现反序列化
*/
try {
InputStream in = new FileInputStream("F:\\360WiFi"+ File.separator+"a.txt");
ObjectInputStream os = new ObjectInputStream(in);
byte[] buffer = new byte[10];
int len = -1;
User u = (User) os.readObject();
System.out.println("反序列化:");
System.out.println(u);
os.close();
}catch (Exception e){
e.printStackTrace();
} }
}
//输出结果:
User{name='小明', age=10}
反序列化:User{name='小明', age=10}
在序列化时,如果javabean完成序列化后,修改javabean,在次进行反序列化会出现以下问题:
解决:
在javabean中条添加 serialVersionUID 固定版本。
private static final long serialVersionUID = 1L;
javabean
java基础序--列化和反序列化的更多相关文章
- JAVA基础4---序列化和反序列化深入整理(JDK序列化)
一.什么是序列化和反序列化? 序列化:将对象状态信息转化成可以存储或传输的形式的过程(Java中就是将对象转化成字节序列的过程) 反序列化:从存储文件中恢复对象的过程(Java中就是通过字节序列转化成 ...
- Java基础知识:序列化和反序列化
一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...
- java----序列化与反序列化中及java序列化本质就是存储一个对象,然后在其他地方在调用它
Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是 ...
- Java IO---序列化和反序列化
一.序列化和反序列化介绍 什么是序列化和反序列化? 序列化就是将对象转换为字节序列的过程. 反序列化就是将字节序列恢复为对象的过程. 序列化的用途在哪? 通常情况下,序列化有两个用途: 将对象 ...
- SimpleRpc-序列化与反序列化的设计与实现
为什么需要序列化和反序列化? 假设你是客户端,现在要调用远程的加法计算服务,你与服务端商定好了发送数据的格式:发送8个字节的请求,前4字节是第一个数,后4字节是第二个数,服务端读取数据的时候也按照商定 ...
- Java I/O---序列化接口Serializable
1.JDK API 中关于Serializable的描述 public interface Serializable 类通过实现 java.io.Serializable 接口以启用其序列化功能.未实 ...
- JavaSE-序列化和反序列化
什么是序列化,什么时候要进行序列化? 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,将数据分解成字节流,以便存储在文件中或在网络上传输. 我们在对java对象进行IO流操作 ...
- java--序列化和反序列化
一.序列化 java序列化的过程是把对象转换为字节序列的过程 序列化的两种用途: 1)把对象的字节序列永久保存大搜硬盘上,通常存放到一个文件中 2)在网络上传送对象的字节序列 jdk中的序列化API: ...
- netty6---序列化与反序列化
package com.cn; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import ja ...
随机推荐
- synchronized 代码块怎么用
加不加 synchronized 有什么区别? synchronized 作为悲观锁,锁住了什么? 之前 2 篇文章我们已经知道 synchronized 的使用方法以及锁的内容(实例对象和Class ...
- js 异或加密
// 按位异或 加密 var posNo = 'C0041710190002' // 特殊字符不进行 与或 加密 (因为A,a,Z,z,转换后会变成符号,不方面用户输入 ...
- QFileDialog::getOpenFileName() hangs
https://forum.qt.io/topic/49209/qfiledialog-getopenfilename-hangs-in-windows-when-using-the-native-d ...
- 在java中使用JMH(Java Microbenchmark Harness)做性能测试
文章目录 使用JMH做性能测试 BenchmarkMode Fork和Warmup State和Scope 在java中使用JMH(Java Microbenchmark Harness)做性能测试 ...
- mybatis if test标签的使用
2019独角兽企业重金招聘Python工程师标准>>> 在使用mybatis 有时候需要进行判断的. 而我们知道mybatis获取值有两种方式 #{}和${}的. 那么,在mybat ...
- Bomb Enemy 炸弹人
Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number zero), return ...
- Character Array and Character Pointer
最近复习数据结构实验时,碰到这么一行代码,看的有点不爽. typedef char** HuffmanCode; 借此梳理下数组和指针. int* p; //指针变量p中存的地址代表的内存单元中的数据 ...
- Vim Configuration
安装原生态的Vim之后,界面是这样的: 行号,没有:自动缩进,没有:括号匹配,没有~ 为了我们使用的方便,进行一些基本的配置: sudo vim /etc/vim/vimrc 进入配置界面: 如下图进 ...
- libevent(九)evhttp
用libevent构建一个http server非常方便,可参考libevent(六)http server. 主要涉及的一个结构体是evhttp: struct evhttp { /* Next v ...
- springboot关于webmvc配置问题记录
在之前的文章(springboot配置静态资源访问路径)中说过,springboot默认的加载静态资源的地方是在resources目录下的static文件夹下,其实除了resources目录下得sta ...