• Java 对象序列化


    目录

    一、序列化

    定义:

    方法:

    代码:

    二、反序列化

    定义:

    方法:

    代码:

    三、自定义类序列化

    步骤:

    代码:


    一、序列化

    定义:

    将内存中的Java对象保存到磁盘中或通过网络传输过去

    方法:

    使用过ObjectOutputStream类实现。

    另外,ObjectOutputStream和ObjectInputStream不能序列化static和transient的成员变量

    代码:

    1. //序列化过程
    2. @Test
    3. public void test_Objectoutputstream(){
    4. ObjectOutputStream oos= null;
    5. try {
    6. oos = new ObjectOutputStream(new FileOutputStream("D:\\Java develop\\Program\\superior_Java\\hello5.dat"));
    7. String name="Ingram";
    8. oos.writeObject(name);
    9. oos.flush();
    10. } catch (IOException e) {
    11. throw new RuntimeException(e);
    12. } finally {
    13. if(oos!=null) {
    14. try {
    15. oos.close();
    16. } catch (IOException e) {
    17. throw new RuntimeException(e);
    18. }
    19. }
    20. }
    21. }

    二、反序列化

    定义:

    将对象从磁盘或者网络中读取到内存中(程序中)的过程

    方法:

    使用ObjectInputStream类实现

    代码:

    1. //反序列化过程
    2. @Test
    3. public void test_ObjectInputStream() {
    4. ObjectInputStream ois= null;
    5. try {
    6. ois = new ObjectInputStream(new FileInputStream("D:\\Java develop\\Program\\superior_Java\\hello5.dat"));
    7. Object s=ois.readObject();
    8. String str=(String)s;
    9. System.out.println(str);
    10. } catch (IOException e) {
    11. throw new RuntimeException(e);
    12. } catch (ClassNotFoundException e) {
    13. throw new RuntimeException(e);
    14. } finally {
    15. if(ois != null)
    16. try {
    17. ois.close();
    18. } catch (IOException e) {
    19. throw new RuntimeException(e);
    20. }
    21. }
    22. }

    运行结果:

    三、自定义类序列化

    步骤:

    要实现自定义类序列化:

    1.需要去实现接口:Serializable

    2.需要为当前类提供一个全局常量:SerializableUID

    3.除了当前类Person需要实现Serializable接口之外,还必须保证内部所有属性也必须是可序列化的

    代码:

    先定义一个Person类

    1. package Network_programming;
    2. import java.io.Serializable;
    3. /*要实现自定义类可序列化:
    4. * 1.需要实现接口:Serializable
    5. * 2.需要当前类提供一个全局常量:SerializableUID
    6. * 3.除了当前类Person需要实现Serializable接口之外,还必须保证内部所有属性也必须是可序列化的
    7. * */
    8. public class Person implements Serializable {
    9. public static final long serializableUID=23424324234L;
    10. private String name;
    11. private int number;
    12. public Person(String name, int number) {
    13. this.name = name;
    14. this.number = number;
    15. }
    16. public Person() {
    17. }
    18. /**
    19. * 获取
    20. * @return name
    21. */
    22. public String getName() {
    23. return name;
    24. }
    25. /**
    26. * 设置
    27. * @param name
    28. */
    29. public void setName(String name) {
    30. this.name = name;
    31. }
    32. /**
    33. * 获取
    34. * @return number
    35. */
    36. public int getNumber() {
    37. return number;
    38. }
    39. /**
    40. * 设置
    41. * @param number
    42. */
    43. public void setNumber(int number) {
    44. this.number = number;
    45. }
    46. public String toString() {
    47. return "Person{name = " + name + ", number = " + number + "}";
    48. }
    49. }

    序列化与反序列化实现:

    1. package Network_programming;
    2. import org.junit.Test;
    3. import java.io.*;
    4. public class demo2 {
    5. public static void main(String[] args) {
    6. test_Objectoutputstream();
    7. test_ObjectInputStream();
    8. }
    9. public static void test_Objectoutputstream(){
    10. ObjectOutputStream oos= null;
    11. try {
    12. oos = new ObjectOutputStream(new FileOutputStream("D:\\Java develop\\Program\\superior_Java\\hello6.dat"));
    13. String name="Ingram";
    14. //oos.flush();
    15. oos.writeObject(name);
    16. oos.writeObject(new Person("ingram",14));
    17. oos.flush();
    18. } catch (IOException e) {
    19. throw new RuntimeException(e);
    20. } finally {
    21. if(oos!=null) {
    22. try {
    23. oos.close();
    24. } catch (IOException e) {
    25. throw new RuntimeException(e);
    26. }
    27. }
    28. }
    29. }
    30. //反序列化过程
    31. public static void test_ObjectInputStream() {
    32. ObjectInputStream ois= null;
    33. try {
    34. ois = new ObjectInputStream(new FileInputStream("D:\\Java develop\\Program\\superior_Java\\hello5.dat"));
    35. Object s=ois.readObject();
    36. String str=(String)s;
    37. System.out.println(str);
    38. System.out.println((Person)ois.readObject());
    39. } catch (IOException e) {
    40. throw new RuntimeException(e);
    41. } catch (ClassNotFoundException e) {
    42. throw new RuntimeException(e);
    43. } finally {
    44. if(ois != null)
    45. try {
    46. ois.close();
    47. } catch (IOException e) {
    48. throw new RuntimeException(e);
    49. }
    50. }
    51. }
    52. }

    结果:

  • 相关阅读:
    Greenplum-表分区
    三面阿里(支付宝)Java高开岗,复习几个月有幸拿到offer!你也可以的哦
    LeetCode_双指针_中等_328.奇偶链表
    1626 无矛盾的最佳球队(排序+动态规划)(灵神笔记)
    瑞芯微RK3568|SDK开发之Kernel编译
    java毕业设计毕业生派遣系统Mybatis+系统+数据库+调试部署
    基于RocketMQ实现分布式事务
    C# Thread.Sleep(0)有什么用?
    基于Springboot实现商品进销存管理系统
    MMRotate 全面升级,新增 BoxType 设计
  • 原文地址:https://blog.csdn.net/wangcheng_BI/article/details/127693026