当前位置:   article > 正文

java:序列化与反序列化_java 序列化和反序列化

java 序列化和反序列化

目录

序列化和反序列化的定义:

如何使用序列化?

总结


序列化和反序列化的定义:

    (1)Java序列化就是指把Java对象转换为字节序列的过程 比如可以将一个类转化为json类型

        Java反序列化就是指把字节序列恢复为Java对象的过程。

   (2)序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。

       反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。

 在Java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化。

如何使用序列化?

我们先来测试一下,首先写一个实体类 User

  1. package com.hollis;
  2. import java.io.Serializable;
  3. import java.util.Date;
  4. public class User implements Serializable{
  5. private String name;
  6. private int age;
  7. private Date birthday;
  8. private transient String gender;
  9. private static final long serialVersionUID = -6849794470754667710L;
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. public int getAge() {
  17. return age;
  18. }
  19. public void setAge(int age) {
  20. this.age = age;
  21. }
  22. public Date getBirthday() {
  23. return birthday;
  24. }
  25. public void setBirthday(Date birthday) {
  26. this.birthday = birthday;
  27. }
  28. public String getGender() {
  29. return gender;
  30. }
  31. public void setGender(String gender) {
  32. this.gender = gender;
  33. }
  34. @Override
  35. public String toString() {
  36. return "User{" +
  37. "name='" + name + ''' +
  38. ", age=" + age +
  39. ", gender=" + gender +
  40. ", birthday=" + birthday +
  41. '}';
  42. }
  43. }

对User进行实体化的Demo

  1. package com.hollis;
  2. import org.apache.commons.io.FileUtils;
  3. import org.apache.commons.io.IOUtils;
  4. import java.io.*;
  5. import java.util.Date;
  6. public class SerializableDemo {
  7. public static void main(String[] args) {
  8. //Initializes The Object
  9. User user = new User();
  10. user.setName("hollis");
  11. user.setGender("male");
  12. user.setAge(23);
  13. user.setBirthday(new Date());
  14. System.out.println(user);
  15. //Write Obj to File
  16. ObjectOutputStream oos = null;
  17. try {
  18. oos = new ObjectOutputStream(new FileOutputStream("tempFile"));
  19. oos.writeObject(user);
  20. } catch (IOException e) {
  21. e.printStackTrace();
  22. } finally {
  23. IOUtils.closeQuietly(oos);
  24. }
  25. //Read Obj from File
  26. File file = new File("tempFile");
  27. ObjectInputStream ois = null;
  28. try {
  29. ois = new ObjectInputStream(new FileInputStream(file));
  30. User newUser = (User) ois.readObject();
  31. System.out.println(newUser);
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. } catch (ClassNotFoundException e) {
  35. e.printStackTrace();
  36. } finally {
  37. IOUtils.closeQuietly(ois);
  38. try {
  39. FileUtils.forceDelete(file);
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. }
  45. }
  46. //output
  47. //User{name='hollis', age=23, gender=male, birthday=Tue Feb 02 17:37:38 CST 2016}
  48. //User{name='hollis', age=23, gender=null, birthday=Tue Feb 02 17:37:38 CST 2016}

总结

1、在Java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化。

2、通过ObjectOutputStreamObjectInputStream对对象进行序列化及反序列化

3、虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致(就是 private static final long serialVersionUID

4、序列化并不保存静态变量。

5、要想将父类对象也序列化,就需要让父类也实现Serializable 接口。

6、Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/492876
推荐阅读
相关标签
  

闽ICP备14008679号