完整的Java序列化方式

Java序列化

Java提供了一种对象序列化机制,可以将对象表示为一个字节序列,该字节序列包括对象的数据、对象的类型信息,和对象中数据的类型,将序列化的对象保存在文件中,然后在文件中读取序列,然后反序列化。

类 ObjectInputStream 和 ObjectOutputStream 是高层次的数据流,它们包含反序列化和序列化对象的方法。

public final void writeObject(Object x) throws IOException

该方法是将对象序列化,然后发送到输出流上

public final Object readObject() throws IOException,ClassNotFoundException

该方法是从输入流上读取数据,并进行反序列化数据为对象
package com.dcits.po;

import java.io.Serializable;

/**
 * Created by gm on 2019/12/23.
 */
public class User implements Serializable{

    private String username;
    private String password;
    private String descripty;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getDescripty() {
        return descripty;
    }

    public void setDescripty(String descripty) {
        this.descripty = descripty;
    }
}

如果需要对一个对象进行序列化,只需要实现 Serializable 接口,对于其中一些不需要序列化的字段,可以使用 transient 关键字

package com.dcits.util;

import com.dcits.po.User;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * Created by gm on 2019/12/23.
 */
public class Test {

    public static void main(String[] args) {

        User user = new User();
        user.setUsername("zhangsan");
        user.setPassword("123456");
        user.setDescripty("这是一个序列化测试程序");

        System.out.println("序列化前:");
        System.out.println("username:" + user.getUsername());
        System.out.println("password:" + user.getPassword());

        try {
            ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("D:/user.txt"));
            os.writeObject(user);
            os.flush();
            os.close();

        }catch (Exception e){
            e.printStackTrace();
        }

        try {
            ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:/user.txt"));
            User user1 = (User) in.readObject();
            System.out.println("反序列化后对象user1:");
            System.out.println("username:" + user1.getUsername());
            System.out.println("password:" + user1.getPassword());
            in.close();

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

运行结果:

com.dcits.util.Test
序列化前:
username:zhangsan
password:123456
反序列化后对象user1:
username:zhangsan
password:123456

Process finished with exit code 0

对于 password 如果不允许序列化,添加 transient 关键字

transient private String password;

运行结果:

com.dcits.util.Test
序列化前:
username:zhangsan
password:123456
反序列化后对象user1:
username:zhangsan
password:null

Process finished with exit code 0

可以看到 password 并未在反序列化时读取到数据。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿小木的愤怒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值