json反序列化失败是什么意思?

阳光 2021-01-11 13:28:00 java常见问答 6346

计算机中存储对象状态的转换,转换成某种格式即为序列化,从某种格式转换回来即为反序列化。但是最近有人发现json反序列化失败,不知道这是什么意思?那么今天我们就来给大家讲解一下。

其实就是大家发过来想想序列化的含义,是将对象状态转换为可保持或传输的格式的过程。反序列化失败就是这个过程失败了。

如何实现序列化与反序列化?

1、JDK 类库中序列化 API

使用到JDK中关键类 ObjectOutputStream(对象输出流) 和ObjectInputStream(对象输入流)

ObjectOutputStream 类中:通过使用 writeObject(Object object) 方法,将对象以二进制格式进行写入。

ObjectInputStream 类中:通过使用 readObject()方法,从输入流中读取二进制流,转换成对象。

2、目标对象实现 Serializable 接口

我们创建一个 User 类,实现 Serializable 接口,并生成一个版本号 :

public class User implements Serializable
{
    private static final long serialVersionUID = 3604972003323896788 L;
    private transient int age;
    private String name;
    private String sex;
    public int getAge()
    {
        return age;
    }
    public String getName()
    {
        return name;
    }
    public String getSex()
    {
        return sex;
    }
    public void setAge(int age)
    {
        this.age = age;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public void setSex(String sex)
    {
        this.sex = sex;
    }

首先:

1、Serializable 接口的作用只是用来标识我们这个类是需要进行序列化,并且 Serializable 接口中并没有提供任何方法。

2、SerialVersionUid 序列化版本号的作用是用来区分我们所编写的类的版本,用于判断反序列化时类的版本是否一直,如果不一致会出现版本不一致异常。

3、transient 关键字,主要用来忽略我们不希望进行序列化的变量

由于第一种形式太不常见,顾不再啰嗦演示,直接来看第二种实现 Serializable 接口的写入方式:

定义一个Person类,实现Serializable接口

public class Person implements Serializable
{
    private static final long serialVersionUID = -5809452578272945389 L;
    private int age;
    private String name;
    private String sex;
    get..
    set...
}

序列化和反序列化Person类对象

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.MessageFormat;
/**
*
Description: 测试对象的序列化和反序列
*/
public class TestObjSerializeAndDeserialize
{
    public static void main(String[] args) throws Exception
    {
        /**序列化Person对象**/
        SerializePerson();
        /**反序列Perons对象**/
        Person p = DeserializePerson();
        System.out.println(MessageFormat.format("name={0},age={1},sex={2}", p.getName(), p.getAge(), p.getSex()));
    }
    /**
    * Description: 序列化Person对象
    */
    private static void SerializePerson() throws FileNotFoundException
        , IOException
        {
            Person person = new Person();
            person.setName("gacl");
            person.setAge(25);
            person.setSex("男");
            /** ObjectOutputStream 对象输出流,将Person对象存储到E盘的Person.txt文件中,完成对Person对象的序列化操作 **/
            ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(
                new File("E:/Person.txt")));
            oo.writeObject(person);
            System.out.println("Person对象序列化成功!");
            oo.close();
        }
    /**
    * Description: 反序列Perons对象
    */
    private static Person DeserializePerson() throws Exception, IOException
    {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
            new File("E:/Person.txt")));
        Person person = (Person) ois.readObject();
        System.out.println("Person对象反序列化成功!");
        return person;
    }
}

这些就是实现序列化以及反序列化的过程,java人员可以好好研究这些,毕竟关于json的知识点还是很多的。最后大家如果想要了解更多json工具教程知识,敬请关注奇Q工具网。

推荐阅读:

fastjson反序列化漏洞怎么解决?漏洞原理是什么?

java如何接收json数据?json的类型有哪些?

java实现json格式化怎么操作?格式化如何输出到控制台?