zoukankan      html  css  js  c++  java
  • JavaSE——序列化和反序列化

    序列化:

    序列化对应写的操作。(读与写都是站在应用的角度上)

    序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了更方便的对对象流进行存储和读的操作。
    序列化的实现:将需要被序列化的类实现Serializable接口,该接口为一个标识接口,没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。  

    public class Person implements Seriaizable

    ObjectOutputStream oos = new ObjectOutputStream(new FIleOutputStream(FIle file))

    oos.writeObject(person)

    package xulieh;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    
    public class Demo02 {
        public static void main(String[]args){
            //序列化
            Person person = new Person("张三", 20, "火星");
            ObjectOutputStream oos = null;
            try {
                oos = new ObjectOutputStream(new FileOutputStream("D:/person2.dat"));
                oos.writeObject(person);
                oos.flush();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                try {
                    oos.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    
    }

    序列化的结果是不认识的字符,所以需要反序列化使其显示为可以看懂的原先的内容。

    当要被序列化的属性的类实现了 Seriaizable 这一接口,就表示可以被序列化,java运行机制会自动去序列化该类中的所有属性。尽管该接口中没有任何要实现的方法。

    如果继承了该接口并且有某些不想被序列化的属性,则在属性前加上关键字 transient 修饰即可。

    如,private transient String name; private transient int age;

          对person类进行序列化后的结果默认为 null 和 0;

    transient修饰的属性不被序列化仅用于实现 Seriaizable 接口的情况。该种情况下会自动进行序列化。

    如果要程序员自己控制序列化,则可以实现另外一个接口 Externalizable

    接口:Externalizable (给以外形 客观化 具体化)

     如果一个类实现了 Externalizable 接口,则同时要实现该接口中的两个方法。

    writeExternal

    void writeExternal(ObjectOutput out)
                       throws IOException
    该对象可实现 writeExternal 方法来保存其内容,它可以通过调用 DataOutput 的方法来保存其基本值,或调用 ObjectOutput 的 writeObject 方法来保存对象、字符串和数组。
    参数:
    out - 要写入对象的流
    抛出:
    IOException - 包含可能发生的所有 I/O 异常

    readExternal

    void readExternal(ObjectInput in)
                      throws IOException,
                             ClassNotFoundException
    对象实现 readExternal 方法来恢复其内容,它通过调用 DataInput 的方法来恢复其基础类型,调用 readObject 来恢复对象、字符串和数组。readExternal 方法必须按照与 writeExternal 方法写入值时使用的相同顺序和类型来读取这些值。
    参数:
    in - 为了恢复对象而从中读取数据的流
    抛出:
    IOException - 如果发生 I/O 错误
    ClassNotFoundException - 如果无法找到需要恢复的某个对象的类。

    public class Person implements Externalizable

    public void writeExternal(ObjectOutput out)

    out.writeObject(this.getName())

    out.writeInt(this.getAge())

    public void readExternal(ObjectInput in)

    this.setAge(in.readInt())

    this.setName((String)in.readObject())

    反序列化:

    反序列化对应读的操作。

    ObjectInputStream ois

    ois.readObject()

  • 相关阅读:
    Redis系列之一缓存穿透,缓存击穿,缓存雪崩
    centos 7 安装KVM
    windows 下免安装版本(zip archive)的 mysql 安装
    IDEA Scala 程序报错 Exception in thread "main" java.lang.NoClassDefFoundError: scala/Predef$
    Could not open client transport with JDBC Uri: jdbc:hive2://localhost:10000: Invalid status 16 (state=08S01,code=0)
    串口知识笔记
    C语言常用函数笔记
    流媒体服务器、海康威视 大华摄像头实现视频监控、直播解决方案(转)
    315M、433M和2.4G笔记
    MOS管开关电路笔记
  • 原文地址:https://www.cnblogs.com/linlin0/p/6135458.html
Copyright © 2011-2022 走看看