Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程,如:把一个Java对象写入到磁盘或传输到网络上其他计算机中,此时需要通过Java序列化把对象转换成字节序列。

如何实现Java序列化与反序列化?

Java JDK类库中序列化API如下:

java.io.ObjectOutputStream:表示对象输出流,它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

java.io.ObjectInputStream:表示对象输入流,它的readObject()方法源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回。

实现序列化必须满足的要求:

实现SerializableExternalizable接口的类的对象才能被序列化,否则抛出异常。

下面为大家举例实现Serializable,代码如下:

package com.test;
import java.io.*;
/**
 * 素文宅  www.yoodb.com
 */
class Yoodb implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
    private transient String password;
    private static int count = 0;
 
    public Yoodb(String name, String password) {
System.out.println("调用Yoodb带参的构造函数");
this.name = name;
this.password = password;
count++;
    }
 
    public String toString() {
return "计数: " + count + " 姓名: " + name + " 密码: " + password;
    }
}
 
public class ObjectSerTest {
    public static void main(String args[]) {
try {
    FileOutputStream fos = new FileOutputStream("yoodb.obj");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    Yoodb y1 = new Yoodb("张三", "123456");
    Yoodb y2 = new Yoodb("李四", "654321");
    oos.writeObject(y1);
    oos.writeObject(y2);
    System.out.println(y1);
    System.out.println(y2);
    System.out.println("----------欢迎收藏本站www.yoodb.com----------------");
    oos.close();
    fos.close();
    
    FileInputStream fis = new FileInputStream("yoodb.obj");
    ObjectInputStream ois = new ObjectInputStream(fis);
    y1 = (Yoodb) ois.readObject();
    y2 = (Yoodb) ois.readObject();
    System.out.println(y1);
    System.out.println(y2);
    ois.close();
    fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
    e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    }
}

执行代码,输出结果如下:

调用Yoodb带参的构造函数
调用Yoodb带参的构造函数
计数: 2 姓名: 张三 密码: 123456
计数: 2 姓名: 李四 密码: 654321
----------欢迎收藏本站www.yoodb.com----------------
计数: 2 姓名: 张三 密码: null
计数: 2 姓名: 李四 密码: null

读取文件流,代码如下:

package com.test;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
/**
 * 素文宅  www.yoodb.com
 */
public class Test{
 
 
    public static void main(String args[]){
 
try {
 
    FileInputStream fis = new FileInputStream("yoodb.obj");
    ObjectInputStream ois = new ObjectInputStream(fis);
    Yoodb y1 = (Yoodb) ois.readObject();
    Yoodb y2 = (Yoodb) ois.readObject();
    System.out.println(y1);
    System.out.println(y2);
    ois.close();
    fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
    e.printStackTrace();
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
    e1.printStackTrace();
}
    }
}

执行代码,输出结果如下:

计数: 0 姓名: 张三 密码: null
计数: 0 姓名: 李四 密码: null

注意:

Java中的序列化时transient变量和静态变量不会被序列化

1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问

2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口

3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化

总结:

1)Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程

2)使用Java序列化和反序列化可以实现数据持久化,对象数据远程通信等功能

关注下方微信公众号“Java精选”(w_z90110),回复关键词领取资料:如Mysql、Hadoop、Dubbo、Spring Boot等,免费领取视频教程、资料文档和项目源码。

Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习和工作有所帮助。

评论

分享:

支付宝

微信