计算机中存储对象状态的转换,转换成某种格式即为序列化,从某种格式转换回来即为反序列化。但是最近有人发现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工具网。
推荐阅读: