serialVersionUID:序列化版本号ID,用来标记序列化的类,如果

不添加serialVersionUID,编译器会默认赋一个值给它

java 对json反序列化 json反序列化注意的问题_java 对json反序列化

若反序列化对象时类的UID,和序列化对象的类的UID不一样,会报错

解决方法

1.将序列化的类中的UID改成-3151026672****,保证和反序列时的类UID一直
2.将序列化的类改好UID后在反序列化一次,在通过这个生成的新的bin文件来序列化一次

transient:使属性不被序列化

java 对json反序列化 json反序列化注意的问题_java 对json反序列化_02

运行结果:

java 对json反序列化 json反序列化注意的问题_前端_03

多次序列化 这样多次反序列化就不会异常

java 对json反序列化 json反序列化注意的问题_java_04

s读取的是ligan.bin

s2读取的是sundog.bin

java 对json反序列化 json反序列化注意的问题_前端_05

序列化与反序列化注意事项

(1)序列化类必须实现Serializable接口
(2)序列化类中对象属性要求实现Serializable接口
(3)serialVersionUID:序列化版本号ID:保证序列化的类和反序列化的类是同一个类
(4)使用transient(瞬间的)修饰属性,就不能序列化了
(5)静态属性不能序列化
(6)序列化多个对象,可以借助集合实现

使用objectOutputStream实现对象的序列化

要求;序列化的类必须实现Serializable接口

利用集合写入多个对象,利用集合一次性序列化多个对象

一个bin文件被读取之后,下一个读取指令是读取不了这个bin文件的

package com.qian;


import java.io.FileInputStream;
import java.io.ObjectInputStream;

/**
 * objectInputStream实现反序列化(读取重构对象)
 *注意事项
 * (1)序列化类必须实现Serializable接口
 * (2)序列化类中对象属性要求实现Serializable接口
 * (3)serialVersionUID:序列化版本号ID:保证序列化的类和反序列化的类是同一个类
 * (4)使用transient(瞬间的)修饰属性,就不能序列化了
 * (5)静态属性不能序列化
 * (6)序列化多个对象,可以借助集合实现
 */
public class Demo07
{
    public static void main(String[] args) throws Exception {

        //1.创建对象流
        FileInputStream fis=new FileInputStream("r:\\stu.bin");
        ObjectInputStream ois=new ObjectInputStream(fis);

        //2.读取文件(反序列化)
        Student s=(Student)ois.readObject();//因为ois是 ObjectInputStream类型的,所以要转换
        Student s2=(Student)ois.readObject();//因为ois是 ObjectInputStream类型的,所以要转换

        //3.关闭
        ois.close();
        System.out.println("执行完毕");
        System.out.println(s.toString());
        System.out.println(s2.toString());

    }
}
package com.qian;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

/**
 * 使用objectOutputStream实现对象的序列化
 * 要求;序列化的类必须实现Serializable接口
 */


public class Demo06 {
    public static void main(String[] args) throws Exception {
        //1.创建对象流
        FileOutputStream fos=new FileOutputStream("r:\\stu.bin");//bin表示二进制文件
        ObjectOutputStream oos= new ObjectOutputStream(fos);
        //2.序列化(写入操作
        Student ligan = new Student("李赣",20);
        Student sundog=new Student("孙狗", 64);

        //利用集合写入多个对象
        ArrayList<Student> list=new ArrayList<>();
        list.add(ligan);
        list.add(sundog);

          oos.writeObject(list);//利用ArrayList数组一次性序列化多个对象

//        oos.writeObject(ligan);
//        oos.writeObject(sundog);
        //多次序列化 这样多次反序列化就不会异常

        //3.关闭
        oos.close();//close内自带flush方法
        System.out.println("序列化完毕");

    }

}
.writeObject(sundog);
        //多次序列化 这样多次反序列化就不会异常

        //3.关闭
        oos.close();//close内自带flush方法
        System.out.println("序列化完毕");

    }

}