当前位置: 代码迷 >> 综合 >> Java中序列化(ObjectOutputStream)与反序列化(ObjectInputStream)
  详细解决方案

Java中序列化(ObjectOutputStream)与反序列化(ObjectInputStream)

热度:8   发布时间:2024-01-09 12:40:13.0

序列化:

将对象按照流的方式存储到文本文件中或者再网络中传输   
对象---->流数据    序列化流 (ObjectOutputStream)

反序列化:

将文本文件中的流对象或者网络传输中的流对象还原成对象   

流数据--->对象  反序列化流(ObjectInputStream)

关键字:

transient  修饰属性,这个属性就不会被序列化

注意:

1)必须序列化之后才可以反序列化
2)自定义类要实现序列化功能,必须实现接口Serializable(标记接口),如果没有实现就会报这个错误NotSerializableException。
  
 public class Person implements Serializable{//产生随机的固定Idprivate static final long serialVersionUID = 3929786557947102117L;transient int age  ;//这样这个类的属性就不会被序列化………@Overridepublic String toString() {        //为了打印出来不是地址值return "Person [name=" + name + ", age=" + age + "]";}}
   
3)如果一个类序列化之后,修改了这个类的成员变量,再反序列化,则会报错InvalidClassException,一般情况下这个错误出现的原因:是该类的序列版本号与从流中读取的类描述符的版本号不匹配。
     解决办法:让当前实现类序列化功能的这个类产生一个固定ID,类名会有黄色警告线,直接就点它固定Id

程序示例:
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {write() ;read();}//    反序列化
private static void read() throws FileNotFoundException, IOException, ClassNotFoundException {//创建反序列化流对象public ObjectInputStream(InputStream in)ObjectInputStream in = new ObjectInputStream(new FileInputStream("oos.txt")) ;//读public final Object readObject():从 ObjectInputStream 读取对象。Object obj = in.readObject() ;in.close();System.out.println(obj);//Person [name=高圆圆, age=27]
}//序列化
private static void write() throws FileNotFoundException, IOException {//创建一个序列化流对象//public ObjectOutputStream(OutputStream out)ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt")) ;//创建一个Person类对象Person p = new Person("高圆圆", 27) ;//public final void writeObject(Object obj)oos.writeObject(p);//关闭资源oos.close();}


  相关解决方案