java编程基础-序列化与反序列化
Posted Ocean:)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java编程基础-序列化与反序列化相关的知识,希望对你有一定的参考价值。
序列化
ObjectOutputStream类
将对象数据序列化,保存到文件中
-
构造方法Constructor
ObjectOutPutStream(OutputStream out);
输出字节流对象作为当前方法的参数
新建Person类作为实例:
package cn.ocean888;
import java.io.Serializable;
// 如果一个类需要序列化,则需要遵从Serializable接口
public class Person implements Serializable{
private String name;
private int age;
private char gender;
public Person() {
super();
}
public Person(String name, int age, char gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", gender=" + gender + "]";
}
}
Person类序列化
package cn.ocean888;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class Demo1 {
public static void main(String[] args) {
ObjectOutputStream objectOutputStream = null;
try {
objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\\\JavaCode\\\\test\\\\person.txt"));
// 序列化对象写入文件中
objectOutputStream.writeObject(new Person("ocean", 10, '男'));
} catch (IOException e) {
e.printStackTrace();
} finally {
if (objectOutputStream != null) {
try {
objectOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
ObjectInputStream类
从文件中读取被序列化之后的字节数据,提供反序列化操作,得到一个对象
-
构造方法Constructor
ObjectInputStream(InputStream in);
需要提供一个字节输入流对象来进行操作
Person类反序列化
package cn.ocean888;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Demo1 {
public static void main(String[] args) {
writeObject();
readObject();
}
private static void writeObject() {
ObjectOutputStream objectOutputStream = null;
try {
objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\\\JavaCode\\\\test\\\\person.txt"));
// 序列化对象写入文件中
objectOutputStream.writeObject(new Person("ocean", 10, '男'));
} catch (IOException e) {
e.printStackTrace();
} finally {
if (objectOutputStream != null) {
try {
objectOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
private static void readObject() {
ObjectInputStream objectInputStream = null;
try {
objectInputStream = new ObjectInputStream(new FileInputStream("D:\\\\JavaCode\\\\test\\\\person.txt"));
// 从保存字节序列化数据的文件中读取一个对象返回,返回值类型是Object类型
// 实际保存的是Person类型,可以进行强制转换
Person p = (Person) objectInputStream.readObject();
System.out.println(p);
} catch (IOException | ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (objectInputStream != null) {
try {
objectInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
成功读取序列化对象
反序列化注意事项
-
如果一个类需要进行序列化操作,必须遵从java.io.Serializable,不遵从无法进行序列化操作
-
序列化之后从文件中读取序列化内容,转换成对应的对象
ClassNotFound
-
transient修饰的成员变量不能被序列化
以上是关于java编程基础-序列化与反序列化的主要内容,如果未能解决你的问题,请参考以下文章