javaIO中的序列化和反序列化

2022-11-21,

javaIO中的序列化和反序列化

1、什么是序列化?它是来解决什么问题的

1、我们创建的对象,一般情况下在内存中,程序关闭,或者因为没有地址指向而导致垃圾回收
2、这样,我们的对象就会丢失
3、那么我们就需要一种技术来把对象存在文件中,这样就不会丢失
4、因此,把对象存入文件,我们叫序列化技术,把文件中的对象取出来,我们叫反序列化技术。

2、如何实现序列化(例如:)

1、需要序列化的对象加一个标记接口Serializable

/**
* 1、需要序列化的对象加一个标记接口Serializable
*/
public class Book implements Serializable {
int age;
String name;
public Book(int age,String name) {
this.age = age;
this.name = name;
} public Book() { } @Override
public String toString() {
return "Book{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}

2、直接进行IO操作即可

public class SerializeUser {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
//序列化
serializable();
//反序列化
deserializable();
} /**
* 序列化技术
* @throws IOException 抛出IO异常给父亲
*/
public static void serializable() throws IOException {
Book book1 = new Book(12,"金苹果");
Book book2 = new Book(13,"银苹果");
List<Book> list = new ArrayList<>();
list.add(book1);
list.add(book2);
FileOutputStream fos = new FileOutputStream("list.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(list);
oos.close();
} /**
* 反序列化技术
* @throws IOException 抛出IO异常给父亲
* @throws ClassNotFoundException 抛出文件找不到异常给父亲
*/
public static void deserializable() throws IOException, ClassNotFoundException {
File file = new File("list.txt");
FileInputStream fis = new FileInputStream("list.txt");
if(!file.exists() || file.length() == 0) {
return;
}
ObjectInputStream ois = new ObjectInputStream(fis);
List<Book> list = (List<Book>) ois.readObject();
for(Book book: list) {
System.out.println(book);
}
} }

3、如何实现部分序列化

1、属性中添加添加修饰符transient的成员属性,这个成员属性不能被序列化,其他正常序列化
2、属性中添加static也是不能被序列化
3、在实现标记接口Serializable的类中重写writeObject,和ReadObject必须是private void类型(例如)
public class Book implements Serializable {
int age;
String name;
public Book(int age,String name) {
this.age = age;
this.name = name;
} public Book() { } /**
* 将需要序列化的对象写到 out.writeObject()方法中
*/
@Override
private void writeObject() throws IOException {
out.writeObject(age);
out.writeObject(name);
} /**
* 和序列化对应,并和序列化的对象一一对应
*/
@Override
private void writeObject() throws IOException {
int age = (int)in.writeObject();
String name =(String) in.writeObject();
} @Override
public String toString() {
return "Book{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}

4、实现接口Externalizable,实现方法writeExternal和方法readExternal

javaIO中的序列化和反序列化的相关教程结束。

《javaIO中的序列化和反序列化.doc》

下载本文的Word格式文档,以方便收藏与打印。