一、什么是序列化和反序列化:

  序列化:是指把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基础序--列化和反序列化的更多相关文章

  1. JAVA基础4---序列化和反序列化深入整理(JDK序列化)

    一.什么是序列化和反序列化? 序列化:将对象状态信息转化成可以存储或传输的形式的过程(Java中就是将对象转化成字节序列的过程) 反序列化:从存储文件中恢复对象的过程(Java中就是通过字节序列转化成 ...

  2. Java基础知识:序列化和反序列化

    一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...

  3. java----序列化与反序列化中及java序列化本质就是存储一个对象,然后在其他地方在调用它

    Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是 ...

  4. Java IO---序列化和反序列化

    一.序列化和反序列化介绍 什么是序列化和反序列化? ​ 序列化就是将对象转换为字节序列的过程. ​ 反序列化就是将字节序列恢复为对象的过程. 序列化的用途在哪? 通常情况下,序列化有两个用途: 将对象 ...

  5. SimpleRpc-序列化与反序列化的设计与实现

    为什么需要序列化和反序列化? 假设你是客户端,现在要调用远程的加法计算服务,你与服务端商定好了发送数据的格式:发送8个字节的请求,前4字节是第一个数,后4字节是第二个数,服务端读取数据的时候也按照商定 ...

  6. Java I/O---序列化接口Serializable

    1.JDK API 中关于Serializable的描述 public interface Serializable 类通过实现 java.io.Serializable 接口以启用其序列化功能.未实 ...

  7. JavaSE-序列化和反序列化

    什么是序列化,什么时候要进行序列化? 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,将数据分解成字节流,以便存储在文件中或在网络上传输. 我们在对java对象进行IO流操作 ...

  8. java--序列化和反序列化

    一.序列化 java序列化的过程是把对象转换为字节序列的过程 序列化的两种用途: 1)把对象的字节序列永久保存大搜硬盘上,通常存放到一个文件中 2)在网络上传送对象的字节序列 jdk中的序列化API: ...

  9. netty6---序列化与反序列化

    package com.cn; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import ja ...

随机推荐

  1. pytorch 去除维度为1的维度

    out.squeeze(dim=1) out.squeeze_(dim=1)

  2. 双系统情况下,ubuntu开机挂载Windows分区

    首先:blkid,查看分区所属uuid 其中 /dev/sda5 就是Windows分区 其次:fdisk -l,查看分区情况 通过硬盘大小找到对应要设置的具体分区(其实这步也不用,我只是为了确定) ...

  3. Ubuntu中安装Hadoop

    安装前 1,更新apt sudo apt-get update   会让你输入密码(自己登录Ubuntu的时候设置的),输入密码不会显示在终端面板上,确定自己敲对之后点回车就行. 2,安装SSH服务器 ...

  4. 在IBM Cloud中运行Fabric

    文章目录 打包智能合约 创建IBM Cloud services 创建fabric网络 创建org和相应的节点 创建order org和相应节点 创建和加入channel 导入智能合约 上篇文章我们讲 ...

  5. #Week3 Linear Regression with Multiple Variables

    一.Multiple Features 这节课主要引入了一些记号,假设现在有n个特征,那么: 为了便于用矩阵处理,令\(x_0=1\): 参数\(\theta\)是一个(n+1)*1维的向量,任一个训 ...

  6. 数学--数论-- HDU6298 Maximum Multiple 打表找规律

    Given an integer nn, Chiaki would like to find three positive integers xx, yy and zzsuch that: n=x+y ...

  7. 2019-2020 ICPC, Asia Jakarta Regional Contest A. Copying Homework (思维)

    Danang and Darto are classmates. They are given homework to create a permutation of N integers from  ...

  8. 日常开发中常用的linux命令

    本文并不将linux的常用命令全部罗列出来,列出一下常用.容易忘记的命令. 更详细的说明见:https://www.cnblogs.com/xuxinstyle/p/9609551.html 文件相关 ...

  9. 对MobileNet网络结构的解读

    引言 近几年来,CNN在ImageNet竞赛的表现越来越好.为了追求分类准确度,模型越来越深,复杂度越来越高,如深度残差网络(ResNet)其层数已经多达152层.但是在真实场景中如移动或者嵌入式设备 ...

  10. python(MD5 单向加密)

    import hashlib m3 = hashlib.md5() #定义加密方式 src = bytes(", encoding="utf-8") #定义一个需要加密的 ...