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序列化和反序列化可以实现数据持久化,对象数据远程通信等功能

评论

分享:

支付宝

微信