美文网首页
序列化Serializable

序列化Serializable

作者: 宋song一 | 来源:发表于2018-10-19 16:57 被阅读2次

对象的寿命通常随着生成该对象的程序的终止而终止,有时候需要把在内存中的各种对象的状态(也就是实例变量,不是方法)保存下来, 并且可以在需要时再将对象恢复。

用途:1.想把内存中的对象状态保存到一个文件中或者数据库中时候
2.想把对象通过网络进行传播的时候

  Java 序列化技术可以使你将一个对象的状态写入一个Byte 流里(序列化),并且可以从其它地方把该Byte 流里的数据读出来(反序列化)。
      序列化的作用就是为了不同jvm之间共享实例对象的一种解决方案.由java提供此机制,效率之高,是其他解决方案无法比拟的.

Serializable主要用来支持两种主要的特性:
1、Java的RMI(remote method invocation),RMI允许像在本机上一样操作远程机器上的对象,当发送消息给远程对象时,
就需要用到序列化机制来发送参数和接受返回值
2、Java的JavaBean,Bean的状态信息通常是在设计时配置的,Bean的状态信息必须被保存下来,以便当程序运行时能恢复这些状态信息,这也需要Serializable机制

调用OutputStream的 writeObject 方法实现, 如果要让 java 帮我们做, 要被传输的对象必须实现serializable 接口 , 这样, javac 编译时就会进行特殊处理, 编译的类才可以被writeObject 方法操作, 这就是序列化。

    需要被序列化的类必须实现Serializable 接口, 该接口是一个 mini 接口, 其中没有需要实现的方法,implements Serializable 只是为了标注该对象是可被序列化的。
import java.io.Serializable;

public class Student implements Serializable {
    //private static final long serialVersionUID = 1L;

    public transient String name;
    public static String address;
    public transient int phone=123;
    public static int age=12; // transient瞬态修饰成员,不会被序列化
    public void addressCheck() {
        System.out.println("Address  check : " + name + " -- " + address+"--"+age+"---"+phone);
    }
}
**序列化**
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class demo {
    public static void main(String[] args) {
   Student e = new Student();
        e.name = "张三";
        e.address = "深圳";
        e.age = 20;
        e.phone = 456;
 try {
 FileOutputStream fos = new FileOutputStream("a.txt");
            // 创建序列化流对象
            ObjectOutputStream out = new ObjectOutputStream(fos);
            // 写出对象
            out.writeObject(e);
            // 释放资源
            out.close();
            fos.close();
          
            System.out.println("序列化数据已保存");
      } catch (Exception i) {
            i.printStackTrace();
        }
    }
}

调用序列化类的参数时,若设置了变量的值,
1.如果序列化类没有设置变量的值,static和transient都返回各自类型的默认初始值,如int为0,string为null
2.如果序列化类有设置值,static返回这个设置的值,transient仍返回默认初始值
不想初始化的变量,用transient修饰. static是类的变量,保存的是初始值

反序列化
import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class demo {
    public static void main(String[] args) {
try {
   Student student = null;
            FileInputStream fis = new FileInputStream("a.txt");
            ObjectInputStream ois = new ObjectInputStream(fis);
            // 读取一个对象
            student = (Student) ois.readObject();
            // 释放资源a
            ois.close();
            fis.close();
            System.out.println("Name: " + student.name);
            System.out.println("Age: " + student.age);
         
            student.addressCheck();
      } catch (Exception i) {
            i.printStackTrace();

        }
    }
}

如果能找到一个对象的class文件,我们可以进行反序列化操作.如果找不到class文件,则抛出ClassNotFoundException 异常。
当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改, 那么反序列化操作也会失败,抛出一个InvalidClassException异常.可在序列化类(对象)添加private static final long serialVersionUID = 1L;,就可以被反序列化

相关文章

网友评论

      本文标题:序列化Serializable

      本文链接:https://www.haomeiwen.com/subject/hznyzftx.html