zoukankan      html  css  js  c++  java
  • Serializable 介绍

    今天咱们简单介绍一些serializable。

    1、序列化是干什么的?

      简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。

    2、什么情况下需要序列化?

        a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;

        b)当你想用套接字在网络上传送对象的时候;比如淘宝的HSF中间件。

        c)当你想通过RMI传输对象的时候;

    3、当对一个对象实现序列化时,究竟发生了什么?

      在没有序列化前,每个保存在堆(Heap)中的对象都有相应的状态(state),即实例变量(instance ariable)比如:  

    Person p = new Person();
    p.setAge(12); 
    p.setName("liqiu");

      当通过下面的代码序列化之后,p对象中的name和age实例变量的值(liqiu,12)都被保存到一个(tmp.object)文件中,这样以后又可以把它从文件中读出来,重新在堆中创建原来的对象。当然保存时候不仅仅是保存对象的实例变量的值,JVM还要保存一些小量信息,比如类的类型等以便恢复原来的对象。

    FileOutputStream fs = new FileOutputStream(filename);
    ObjectOutputStream os = new ObjectOutputStream(fs);
    os.writeObject(p);

    下面是实现的代码:

    Test.java

    package com.taobao.serializable;
    
    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.io.Serializable;
    
    public class Test {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            Person p = new Person();
            //Test.serialization(p);
            Test.unserialization(p);
        }
        
        public static void serialization(Person p) throws IOException, ClassNotFoundException{
            String filename = "tmp.object";
            p.setAge(12);
            p.setName("liqiu");
            
            FileOutputStream fs = new FileOutputStream(filename);
            ObjectOutputStream os = new ObjectOutputStream(fs);
            os.writeObject(p);
            os.close();
            
        }
        
        public static void unserialization(Person p) throws IOException, ClassNotFoundException{
            String filename = "tmp.object";
            // 反序列化(读出保存的对象文件)
            ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename));
            p = (Person) (in.readObject());
            System.out.println(p.getName());
            in.close();
        }
    }

    Person.java

    package com.taobao.serializable;
    
    import java.io.Serializable;
    
    class Person implements Serializable {
        
        private static final long serialVersionUID = 1L;
        public String name;
        public int age;
        public String pass;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }

      细心的你可能发现了红色的部分,添加了一个serialVersionUID,这是一个标识,如果解析的类与序列化的类略有区别,那么如果没有这个值,一定会抛出异常,如果设置了,那么会根据它来判断是否一致。

    4、瞬态管家字  transient

      大家知道,序列化的内容不包括类的static内容,但是当你不希望不是static的属性被序列化的时候,可以添加transient这个关键字标识。

  • 相关阅读:
    AS将一个项目导入到另一个项目中
    Android Studio出现:Cause: unable to find valid certification path to requested target
    小米手机Toast带app名称
    PopupWindow 点击外部区域无法关闭的问题
    EditText inputType类型整理
    Fragment通过接口回调向父Activity传值
    Android selector一些坑
    Installation failed with message Failed to commit install session 634765663 with command cmd package
    旷视上海研究院机器人方向招聘
    语义SLAM的数据关联和语义定位(四)多目标测量概率模型
  • 原文地址:https://www.cnblogs.com/liqiu/p/3640268.html
Copyright © 2011-2022 走看看