java 序列化是做什么的?

简而言之,就是把你的数据换个时间或换个地点,继续使用,换个时间就是指存盘(存到文件中,等一段时间再去读取之前写入的数据),换个地点就是指网络之间的数据传输。

如果在存盘或传输时想忽略某些数据,就可以使用 transient 修饰符去修饰这个数据。如下:

import lombok.AllArgsConstructor;
import lombok.ToString;
 
import java.io.Serializable;
 
/**
 * <p>
 * <code>UserInfo</code>
 * </p>
 * Description: 实体
 *
 * @author Mcchu
 * @date 2017/11/9 13:46
 */
@AllArgsConstructor
@ToString
public class UserInfo implements Serializable{
 
    private static final long serialVersionUID = 996890129747019948L;
 
    private String name;
 
    private transient String password;
 
    private static String position;
}
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
 
/**
 * <p>
 * <code>TransientTest</code>
 * </p>
 * Description:
 *
 * @author Mcchu
 * @date 2017/11/9 13:45
 */
public class TransientTest {
 
    public static void main(String[] args) {
        UserInfo userInfo = new UserInfo("jalen", "123456");
        System.out.println(userInfo);
 
        try {
            // 序列化,被设置为 transient 的属性没有被序列化
            ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream(
                    "user"));
            o.writeObject(userInfo);
            o.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        try {
            // 重新读取内容
            ObjectInputStream in = new ObjectInputStream(new FileInputStream(
                    "user"));
            UserInfo readUserInfo = (UserInfo) in.readObject();
            // 读取后 psw 的内容为 null
            System.out.println(readUserInfo.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

当使用 transient 修饰 password 字段时,在内存中这个字段并未做序列化,故重新读取内容后输出是为空,下面是输出结果:

UserInfo(name=jalen, password=123456)
UserInfo(name=jalen, password=null)
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Jalen Chu 微信支付

微信支付

Jalen Chu 支付宝

支付宝

Jalen Chu 公众号

公众号