旗下导航:搜·么
当前位置:网站首页 > MySQL教程 > 正文

Java中怎样完成对象的序列化和反序列化?(两种要领)【MySQL教程】,Java

作者:搜教程发布时间:2019-11-27分类:MySQL教程浏览:71评论:0


导读:本篇文章给人人带来的内容是关于Java中怎样完成对象的序列化和反序列化?(两种要领),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。弁言:序列化是将对象...
本篇文章给人人带来的内容是关于Java中怎样完成对象的序列化和反序列化?(两种要领),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。

弁言:

序列化是将对象的状况信息转换为能够存储或传输的情势的历程,在序列化时期,对象将其带你过去的状况写入莅临时或持储存区,反序列化就是从新建立对象的历程,此对象来自于临时或耐久储存区。

序列化的作用:

就好比方存储数据到数据库,将一些数据耐久化到数据库中,而有时刻须要将对象耐久化,虽然说将对象状况耐久化的体式格局有许多,然则java给我们供应了一种很便利的体式格局,那就是序列化,序列化能够完成对象到文件之间的直接转换,完成细节对我们隐蔽。

细致的三种用处:

将对象的状况信息耐久化保存到硬盘上

将对象信息在收集上传输

深度克隆(就是序列化后再反序列化)

体式格局一:完成Serializable接口,经由过程序列化流

完成Serializable接口,经由过程ObjectOutputStream和ObjectInputStream将对象序列化和反序列化。

import java.io.*;
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
//        User user = new User("gol",22);
//        ByteArrayOutputStream bo = new ByteArrayOutputStream();
//        ObjectOutputStream oo = new ObjectOutputStream(bo);
//        oo.writeObject(user);//序列化.user写入字节数组流中
//        ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
//        ObjectInputStream oi = new ObjectInputStream(bi);
//        User userSer = (User) oi.readObject();//反序列化
//        System.out.println(userSer);
        User user = new User("gol",22);
        FileOutputStream fos = new FileOutputStream("a.txt");
        ObjectOutputStream oo = new ObjectOutputStream(fos);
        oo.writeObject(user);//序列化.user写入文件中
        FileInputStream fis = new FileInputStream("a.txt");
        ObjectInputStream oi = new ObjectInputStream(fis);
        User userSer = (User) oi.readObject();//反序列化
        System.out.println(userSer);
        oi.close();
        fis.close();
        oo.close();
        fos.close();
    }
}

体式格局二:完成Externalizable接口,重写writeExternal和readExternal要领

Externalizable接口继续了Serializable接口,替我们封装了两个要领,一个用于序列化,一个用于反序列化。这类体式格局是将属性序列化,注重这类体式格局transient润饰词将落空作用,也就是说被transient润饰的属性,只需你在writeExternal要领中序列化了该属性,还是也会获得序列化。

import java.io.*;
public class User implements Externalizable {
    private static final long serialVersionUID = 1L;
    private  String name;
    private  int age;

    public User() {
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(this.name);//将属性离别序列化
        out.writeObject(this.age);
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        this.name=(String)in.readObject();//反序列化属性
        this.age=(int)in.readObject();
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        FileOutputStream fos = new FileOutputStream("a.txt");
        ObjectOutputStream oo = new ObjectOutputStream(fos);
        FileInputStream fis = new FileInputStream("a.txt");
        ObjectInputStream oi = new ObjectInputStream(fis);
        User user = new User("gol",19);
        user.writeExternal(oo);//序列化
        User userEnr = new User();
        userEnr.readExternal(oi);//反序列化
        System.out.println(userEnr);
        oi.close();
        fis.close();
        oo.close();
        fos.close();
    }
}

总结:

注重以下三点:

Serializable接口是标记接口,是个空接口,用于标识该类能够被序列化。

transient是属性润饰符,被其润饰的属性将不会被序列化,然则运用体式格局二的话,明白写明该属性序列化一样能够获得序列化。

serialVersionUID属性是类的序列化标识ID,若序列化的对象和反序列化的对象其serialVersionUID属性不一样则会报错。

以上就是Java中怎样完成对象的序列化和反序列化?(两种要领)的细致内容,更多请关注ki4网别的相干文章!

标签:Java


欢迎 发表评论: