ホームページ  >  記事  >  データベース  >  Java でオブジェクトのシリアル化と逆シリアル化を実装するにはどうすればよいですか? (2つの方法)

Java でオブジェクトのシリアル化と逆シリアル化を実装するにはどうすればよいですか? (2つの方法)

不言
不言転載
2018-10-10 11:04:582963ブラウズ

この記事では、Java でオブジェクトのシリアル化と逆シリアル化を実装する方法について説明します。 (2つの方法) 必要な友人が参考になれば幸いです。

はじめに:

シリアル化は、オブジェクトの状態情報を保存または送信できる形式に変換するプロセスであり、シリアル化中にオブジェクトはその過去の状態を一時的または永続的なオブジェクトに書き込みます。ストレージ、逆シリアル化は、一時ストレージまたは永続ストレージからオブジェクトを再作成するプロセスです。

シリアル化の役割:

データをデータベースに保存し、一部のデータをデータベースに永続化するのと似ていますが、オブジェクトの状態は永続化されます。さまざまな方法がありますが、Java は非常に便利な方法を提供します。つまり、シリアル化によりオブジェクトとファイル間の直接変換が実現され、実装の詳細は隠蔽されます。

3 つの具体的な用途:

オブジェクトのステータス情報をハードディスクに永続的に保存する

オブジェクト情報をネットワーク経由で送信する

ディープ クローン作成 (つまり、 、シリアル化してから逆シリアル化します)

方法 1: 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();
    }
}

方法 2: Externalizable インターフェイスを実装し、writeExternal メソッドと readExternal メソッドを書き換える

Externalizable インターフェイスは Serializable インターフェイスを継承し、シリアル化用とデシリアライズ用の 2 つのメソッドをカプセル化します。このメソッドは属性をシリアル化します。つまり、このメソッドでは、transient 修飾子はその効果を失います。つまり、writeExternal メソッドで属性をシリアル化する限り、transient によって変更された属性は引き続きシリアル化されます。

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();
    }
}

概要:

次の 3 つの点に注意してください:

Serializable インターフェイスはマーク インターフェイスと空のインターフェイスであり、クラスがシリアル化可能であることを識別するために使用されます。

Transient は属性修飾子であり、これによって変更された属性はシリアル化されません。ただし、方法 2 を使用する場合、属性のシリアル化も可能であることが明確に示されています。

serialVersionUID 属性はクラスのシリアル化 ID です。シリアル化されたオブジェクトと逆シリアル化されたオブジェクトの SerialVersionUID 属性が異なる場合、エラーが報告されます。

以上がJava でオブジェクトのシリアル化と逆シリアル化を実装するにはどうすればよいですか? (2つの方法)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。