zoukankan      html  css  js  c++  java
  • IO流的序列化和反序列化

    序列化和反序列化的概念:

      序列化:把对象转换为字节序列的过程称为对象的序列化。(常见的就是存文件)

      反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

    序列化和反序列化的使用:  

      java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
      java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
      只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。

    关于接口 Serializable的描述:

      类通过实现 java.io.Serializable 接口以启用其序列化功能。
      未实现此接口的类将无法使其任何状态序列化或反序列化。
      可序列化类的所有子类型本身都是可序列化的。因为实现接口也是间接的等同于继承。
      序列化接口没有方法或字段,仅用于标识可序列化的语义。


      对象序列化包括如下步骤:
      1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;
      2) 通过对象输出流的writeObject()方法写对象。

      对象反序列化的步骤如下:
      1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;
      2) 通过对象输入流的readObject()方法读取对象。

    代码:

      ObjectOutputStream代表对象输出流:
      它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

      ObjectInputStream代表对象输入流:
      它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

      定义Person类,实现Serializable接口

    import java.io.Serializable;
    
    public class Demo1Person implements Serializable{
        public String name;
        //禁止组织成员变量序列化   transient  (public  transient int  age;)
        public int age;
        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;
        }
        public Demo1Person(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
        @Override
        public String toString() {
            return "Demo1Person [name=" + name + ", age=" + age + "]";
        }
        
    }

      序列化和反序列化Person对象

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    
    //IO流的对象  实现对IO流的序列化和反序列化
    public class Demo1ObjectStream {
        public static void main(String[] args) throws Exception {
            //writeObject();
            readObject();
        }
        public static void writeObject() throws Exception{
            FileOutputStream fos=new FileOutputStream("c:\person.txt");
            //创建写出对象的序列化流的对象,构造方法传递字节输出流,writeObject()写对象
            ObjectOutputStream oos=new ObjectOutputStream(fos);
            Demo1Person p=new Demo1Person("光头强", 5);
            oos.writeObject(p);
            oos.close();
        }
        public static void readObject() throws Exception{
            FileInputStream fis=new FileInputStream("c:\person.txt");
            //创建反序列化流,readObject()读对象
            ObjectInputStream ois=new ObjectInputStream(fis);
            Object obj=ois.readObject();//读对象
            System.out.println(obj);
            ois.close();
        }
    }
  • 相关阅读:
    ECharts之柱状图 饼状图 折线图
    Vue自定义指令(directive)
    HDU 1231 最大连续子序列
    POJ 2533 Longest Ordered Subsequence
    HDU 1163 Eddy's digital Roots
    HDU 2317 Nasty Hacks
    HDU 2571 命运
    HDU 4224 Enumeration?
    HDU 1257 最少拦截系统
    HDU 2740 Root of the Problem
  • 原文地址:https://www.cnblogs.com/duguangming/p/10609774.html
Copyright © 2011-2022 走看看