• 序列化流与反序列化流


    序列化流与反序列化流

    对象可(反)序列化的条件

    1.Serializable接口

    要进行序列化和反序列的类必须实现该接口,给类添加一个标记。

    当我们进行序列化与反序列化时,会检测该类是否有这个标记: 有:可以进行序列化与反序列化

    没有:抛出NotSerializable接口Exception异常

    进行反序列化时还必须存在对应的class文件,否则会抛出(ClassNotFoundException)

    2.transient(瞬态关键字)

    static :

    静态优先于非静态加载到内存中(优先于对象进入内存);

    被static修饰的成员变量不能被序列化与反序列化;

    被transient修饰的成员变量也不能被序列化与反序列化,但是没有静态含义

    序列号:每一个类被序列化时会自动生成一个序列号进行标记,当该类发生变化时,序列号也会发生变化。我们也可以自己定义序列号:

    private static final long serialVersionUID=—;

    序列化流

    1.ObjectOutputStream

    构造方法:

    ObjectOutputStream(OutputStram out )

    创建写入指定字节输出流的序列化流对象

    特有的的成员方法: void writeObject (Object obj)

    将指定对象写入序列化流,并最终写入字节输出流,并保存在硬盘;

    2.使用步骤:

    创建对象构造方法传递字节输出流;

    使用方法writeobject将对象写入文件;

    释放资源。

    反序列化流

    1.ObjectInputStream

    构造方法:

    ObjectInputStream(InputStream in )

    创建从指定字节输入流读取的反序列化流对象

    特有的的成员方法: void readObject (Object obj)

    从反序列化中读取对象

    2.使用步骤:

    创建对象构造方法传递字节输入流;

    使用方法readobject读取保存对象的文件;

    释放资源和使用对象

    代码练习

    创建一个类用来提供序列化和反序列化创建对象

    import java.io.Serializable;
    
    public class Poem implements Serializable {
        private static final long serialVersionUID = 1L;
        private String name;
        private String sentence;
        transient private int year;
    
        public Poem() {
        }
    
        public Poem(String name, String sentence, int year) {
            this.name = name;
            this.sentence = sentence;
            this.year = year;
        }
    
        public String getName() {
            return this.name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSentence() {
            return this.sentence;
        }
    
        public void setSentence(String sentence) {
            this.sentence = sentence;
        }
    
        public int getYear() {
            return this.year;
        }
    
        public void setYear(int year) {
            this.year = year;
        }
    }
    View Code

    练习序列化流与反序列化流

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    
    public class DemoObject06 {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            File file = new File("Month\src\LearnIO2\obj.txt");
            read_object(file);
        }
    
        public static void write_object(File file, Poem poem) throws IOException {
            FileOutputStream fos = new FileOutputStream(file);
            ObjectOutputStream obs = new ObjectOutputStream(fos);
            obs.writeObject(poem);
            obs.close();
        }
    
        public static void read_object(File file) throws IOException, ClassNotFoundException {
            FileInputStream fis = new FileInputStream(file);
            ObjectInputStream obs = new ObjectInputStream(fis);
            Object o = obs.readObject();
            obs.close();
            Poem poem = (Poem)o;
            System.out.println(poem.getName() + "  " + poem.getSentence() + "  " );
        }
    }
  • 相关阅读:
    Codeforces Round #652 (Div. 2) A. FashionabLee(几何)
    轻量应用服务器如何通过修改apache配置文件实现非https的访问多域名到不同子目录程序?
    在Windows环境下使用hexo搭建博客以及部署到gitee / github
    使用WordPress搭建个人手机博客(阿里云)
    访问自己服务器的ip地址
    php环境无法上传文件的解决方法
    SSRF漏洞
    CSRF全家桶(含义,防御,攻击)
    JS实现HTML实体与字符的相互转换
    CentOS系统下载及应用部署
  • 原文地址:https://www.cnblogs.com/susexuexi011/p/13976999.html
Copyright © 2020-2023  润新知