Java 序列化、反序列化与transient关键字
JAVA 关键字 序列化 transient
2023-09-11 14:22:55 时间
Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。
整个过程都是Java虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。
package com.demo.test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Date;
public class SerializableDemo {
static class Person implements Serializable {
private static final long serialVersionUID = 1L;
//常量和transient修饰的变量一样不会被序列化
private static final String TEST_CONST = "test const";
private String name;
private int age;
private boolean isMale;
private Date birthday;
private byte[] data;
// transient短暂的,不会被序列化或者反序列化
private transient String password;
public Person(String name, int age, boolean isMale, Date birthday, byte[] data, String password) {
this.name = name;
this.age = age;
this.isMale = isMale;
this.birthday = birthday;
this.data = data;
this.password = password;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", isMale=" + isMale + ", birthday=" + birthday + ", data=" + Arrays.toString(data) + ", password=" + password + "]";
}
}
public static void main(String[] argv) {
Person p = new Person("bob", 24, true, new Date(), new byte[] { 1, 2, 3, 4, 5, 6 }, "123456");
System.out.println("secerialize = " + p);
String path = "D:/test.txt";
try {
// Serialize序列化
FileOutputStream fos = new FileOutputStream(path);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p);
oos.close();
fos.close();
// Deserialize反序列化
FileInputStream fis = new FileInputStream(path);
ObjectInputStream ois = new ObjectInputStream(fis);
p = (Person) ois.readObject();
ois.close();
fis.close();
System.out.println("decerialize = " + p);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
输出结果
使用ultraEdit查看序列化结果
相关文章
- Java transient关键字(序列化避免被反序列化获取敏感信息)
- Java Script 内置对象(四) --------- String 对象
- JAVA成员变量为什么不能在类体中先定义后赋值
- 使用java实现qq邮箱信息的发送(纯java实现)
- Java中commons包中常用的解释
- 【Java】java数据库连接池配置的几种方法
- Java动态代理机制小结
- 第七节:详细讲解Java中的日期,java.util.date
- java二维数组
- netty系列之:java中的base64编码器
- java Properties的用法
- java工具类-日期工具类
- Java|static关键字的应用【工具类、代码块和单例】
- 『Java练习生的自我修养』java-se进阶⁴ • IO流概览
- Linux 下安装java
- JAVA学习.java.sql.date 与java.util.date以及gettime()方法的分析
- java中接口的定义与实现
- java中volatile关键字的含义
- Java从PDF中根据关键字实现截图
- 多种方式解决Java控制台报错 java.util.LinkedHashMap cannot be cast to.....
- java项目异常监控_JAVA项目中的常用的异常处理情况总结
- Java-异常处理