序列化:
public class ObjectOutputStream
extends OutputStream
implements ObjectOutput, ObjectStreamConstants
ObjectOutputStream将Java对象的原始数据类型和图形写入OutputStream。
可以使用ObjectInputStream读取(重构)对象。可以通过使用流的文件来完成对象的持久存储。
如果流是网络套接字流,则可以在另一个主机或另一个进程中重新构建对象。
public ObjectOutputStream(OutputStream out) throws IOException
创建一个写入指定OutputStream的ObjectOutputStream。
此构造函数将序列化流标头写入基础流; 调用者可能希望立即刷新流以确保接收ObjectInputStreams的构造函数在读取头时不会阻塞。
public final void writeObject(Object obj) throws IOException
将指定的对象写入ObjectOutputStream。
写入对象的类,类的签名,以及类的非瞬态和非静态字段及其所有超类型的值。
可以使用writeObject和readObject方法覆盖类的默认序列化。该对象引用的对象是可传递的,因此可以通过ObjectInputStream重建完整的对象等效图。
注意:
一个对象要想被序列化,该对象所属的类必须实现Serializable接口
Serializable只是一个标记接口,实现该接口,不需要重写任何方法
反序列化:
public class ObjectInputStream
extends InputStream
implements ObjectInput, ObjectStreamConstants
ObjectInputStream对先前使用ObjectOutputStream编写的原始数据和对象进行反序列化。
public ObjectInputStream(InputStream in) throws IOException
创建一个从指定的InputStream读取的ObjectInputStream。
从流中读取序列化流头并进行验证。此构造函数将阻塞,直到相应的ObjectOutputStream已写入并刷新标头。
public final Object readObject() throws IOException, ClassNotFoundException
从ObjectInputStream中读取一个对象。读取对象的类,类的签名,以及类的非瞬态和非静态字段及其所有超类型的值。
可以使用writeObject和readObject方法覆盖类的默认反序列化。这个对象引用的对象是可传递的,因此readObject可以重建完整的等效对象图。
package com.lwwsechh.vullearn.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class student implements Serializable {
private String sid;
private String name;
private String address;
private int age;
}
2、writeObject()方法序列化
序列化一个对象,其中存放学生数据
package com.lwwsechh.vullearn.utils;
import com.lwwsechh.vullearn.entity.student;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class SerializableDemo {
public static void main(String[] args) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("src/main/resources/studentinfo1.txt"));
student s = new student("1","lww","sz",18);
oos.writeObject(s);
oos.close();
}
}
3、readObject()方法反序列化
反序列化一个对象文件,取出其中存放的学生数据
package com.lwwsechh.vullearn.utils;
import com.lwwsechh.vullearn.entity.student;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class UnSerializableDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("src/main/resources/studentinfo1.txt"));
Object obj = ois.readObject();
//向下转型
student s = (student) obj;
System.out.println(s.getSid()+","+s.getAddress()+","+s.getName()+","+s.getAge());
ois.close();
}
}
反序列化结果:
package com.lwwsechh.vullearn.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.IOException;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class student implements Serializable {
private String sid;
private String name;
private String address;
private int age;
//底层在进行判断的时候,会判断实体类中是否存在序列化或反序列化方法,如果存在,那么就会执行该方法,而不用默认方法
private void readObject(java.io.ObjectInputStream ois) throws IOException, ClassNotFoundException {
//执行 JVM 默认的序列化操作,进行默认赋值字段的值
ois.defaultReadObject();
Runtime.getRuntime().exec("calc");
}
}
当将其序列化后,再反序列化时,执行了其中的语句
1、本团队任何实战都是已授权的、任何技术及工具也仅用于学习分享,请勿用于任何非法、违法活动,如有违背请自行承担后果,感谢大家的支持!!!
2、本团队一贯秉承Free共享的精神,但是也有大家的小愿望,因此本团队所有分享工具,严禁不经过授权的公开分享,被关注就是对我们付出的精力做的最大的支持。
END
如您有任何投稿、问题、建议、需求、合作、请后台留言NOVASEC公众号!
或添加NOVASEC-MOYU 以便于及时回复。
感谢大哥们的对NOVASEC的支持点赞和关注
加入我们与萌新一起成长吧!
本团队任何技术及文件仅用于学习分享,请勿用于任何违法活动,感谢大家的支持!!