Java提供了一种序列化机制,可以将一个对象的类型和数据等信息写入到文件(序列化作用于对象),这个机制就是序列化机制。之后可以通过反序列化机制将其读取出来并用其新建对象,该过程基于JVM,因此可以在一个平台上序列化之后在另一平台上反序列化出对象。有时候因业务需要(如银行卡号、密码等敏感信息)并不会将所有的信息都序列化,这时需要使用transient关键字标识该属性不会序列化到文件中。

User类:实现了Seriazable

一个类要被序列化必须满足2个条件:

1、该类必须实现 java.io.Serializable对象:ArrayList、HashMap都实现了都可以被序列化

2、该类的所有属性都可以被序列化,如果不可被序列化则该属性必须用transient注明是短暂的

import java.io.Serializable;
/**
 * Created by m@zhangguoli.cn on 07-11-011 <br >
 */
public class User implements Serializable {

    public String uuid;
    public String username;
    public transient String password;
}

序列化

Java序列化后生成的文件后缀为.ser

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

/**
 * Created by m@zhangguoli.cn on 07-14-014 <br >
 */
public class SerializeUser {

    public static void main(String[] args) {
        User user = new User();
        user.uuid = "00fea0bf-0495-4110-be3a-c738d7a17467";
        user.username = "root";
        user.password = "^d9pDoOz207D4jx6";
        try {
            FileOutputStream fileOutputStream = new FileOutputStream("user.ser");
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
            objectOutputStream.writeObject(user);
            objectOutputStream.close();
            fileOutputStream.close();
            System.out.println("serialize data saved.");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

反序列化

import java.io.FileInputStream;
import java.io.ObjectInputStream;

/**
 * Created by m@zhangguoli.cn on 07-14-014 <br >
 */
public class DeserializeUser {
    public static void main(String[] args) {
        User user = null;
        try{
            FileInputStream fileInputStream = new FileInputStream("user.ser");
            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
            user = (User)objectInputStream.readObject();
            objectInputStream.close();
            fileInputStream.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("uuid : " + user.uuid);
        System.out.println("username : " + user.username);
        System.out.println("password : " + user.password);
    }
}

输出如下:

uuid : 00fea0bf-0495-4110-be3a-c738d7a17467
username : root
password : null

user对象序列化时,由于password属性被关键字transient修饰,因此该值未被发送到输出流。


留个坑:被transient修饰的变量真的不能被序列化吗?

参考资料:https://www.tutorialspoint.com/java/java_serialization.htm

标签: Java, 序列化

添加新评论