zoukankan      html  css  js  c++  java
  • Java序列化

    (虽然java序列化没有在实际工作中使用过,但是面试的时候可能会问到,这里还是把一些基本知识总结记录一下。)

    实现一个序列化其实只需要实现 Serializable 接口即可。只要这个类实现了Serializable接口,这个的所有属性和方法都会自动序列化。如果类中的某个属性不需要进行序列化,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。

    代码举例:

    实体类:检验一个类的实例是否能序列化十分简单, 只需要查看该类有没有实现 java.io.Serializable接口。

     1 public class Employee implements java.io.Serializable
     2 {
     3    public String name;
     4    public String address;
     5    public transient int SSN; //不需要实例化的属性
     6    public int number;
     7    public void mailCheck()
     8    {
     9       System.out.println("Mailing a check to " + name
    10                            + " " + address);
    11    }
    12 }

    序列化对象:该程序执行后,就创建了一个名为 employee.ser 文件

     1 import java.io.*;
     2  
     3 public class SerializeDemo
     4 {
     5    public static void main(String [] args)
     6    {
     7       Employee e = new Employee();
     8       e.name = "Reyan Ali";
     9       e.address = "Phokka Kuan, Ambehta Peer";
    10       e.SSN = 11122333;
    11       e.number = 101;
    12       try
    13       {
    14          FileOutputStream fileOut =
    15          new FileOutputStream("/tmp/employee.ser");
    16          ObjectOutputStream out = new ObjectOutputStream(fileOut);
    17          out.writeObject(e);
    18          out.close();
    19          fileOut.close();
    20          System.out.printf("Serialized data is saved in /tmp/employee.ser");
    21       }catch(IOException i)
    22       {
    23           i.printStackTrace();
    24       }
    25    }
    26 }

    反序列化:下面的 DeserializeDemo 程序实例了反序列化,/tmp/employee.ser 存储了 Employee 对象

     1 import java.io.*;
     2  
     3 public class DeserializeDemo
     4 {
     5    public static void main(String [] args)
     6    {
     7       Employee e = null;
     8       try
     9       {
    10          FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
    11          ObjectInputStream in = new ObjectInputStream(fileIn);
    12          e = (Employee) in.readObject();
    13          in.close();
    14          fileIn.close();
    15       }catch(IOException i)
    16       {
    17          i.printStackTrace();
    18          return;
    19       }catch(ClassNotFoundException c)
    20       {
    21          System.out.println("Employee class not found");
    22          c.printStackTrace();
    23          return;
    24       }
    25       System.out.println("Deserialized Employee...");
    26       System.out.println("Name: " + e.name);
    27       System.out.println("Address: " + e.address);
    28       System.out.println("SSN: " + e.SSN);
    29       System.out.println("Number: " + e.number);
    30     }
    31 }

    执行结果:

    Deserialized Employee...
    Name: Reyan Ali
    Address:Phokka Kuan, Ambehta Peer
    SSN: 0
    Number:101

    当对象被序列化时,属性 SSN 的值为 111222333,但是因为该属性是短暂的,该值没有被发送到输出流。所以反序列化后 Employee 对象的 SSN 属性为 0。

  • 相关阅读:
    Java反射得到属性的值和设置属性的值
    想建一个比较严格的自律打卡监督群,群主真的会很较真
    JS面向对象篇四、原型链与继承(多种继承实现方式及其利弊分析)
    JS面向对象篇三、创建对象的几种方法
    JS面向对象篇二、什么是原型?原型对象与实例对象、构造函数的关系及相关方法
    JS面向对象篇一、理解对象及属性特性(属性描述符)
    javascript作用域篇一、什么是javascript作用域链
    javascript函数篇四、函数的属性和方法——apply()、call()和bind()方法区别
    javascript函数篇三、函数声明提升
    javascript函数篇二、深入理解为什么javascript中没有函数重载
  • 原文地址:https://www.cnblogs.com/crazytrip/p/7125402.html
Copyright © 2011-2022 走看看