Javaシリアル化における3つの一般的な問題

1. Javaのシリアル化と逆シリアル化とは何ですか?

Javaシリアル化とは、Javaオブジェクトをバイトシーケンスに変換するプロセスを指し、Java逆シリアル化とは、バイトシーケンスをJavaオブジェクトに復元するプロセスを指します。

シリアル化:オブジェクトのシリアル化の主な用途は、オブジェクトを転送および保存するときに、オブジェクトの整合性と転送可能性を確保することです。シリアル化とは、オブジェクトを順序付けられたバイトストリームに変換して、ネットワーク経由で送信したり、ローカルファイルに保存したりすることです。コア機能は、オブジェクトの状態の保存と再構築です。
デシリアライズ:クライアントは、ファイルまたはネットワークからシリアル化されたオブジェクトのバイトストリームを取得し、バイトストリームに格納されているオブジェクトの状態と説明情報に従って、デシリアライズによってオブジェクトを再構築します。

2.なぜシリアル化と逆シリアル化が必要なのですか?

シリアル化がシリアル化の利点について話すことである理由、シリアル化の利点は何であるか、それで私たちはシリアル化する必要があります。

1つ:オブジェクトのシリアル化により、分散オブジェクトを実現できます。

メインアプリケーションは次のとおりです。RMI(つまり、Remote Method Invocation)は、オブジェクトがローカルマシンで実行される場合と同様に、オブジェクトのシリアル化を使用してリモートホストでサービスを実行します。

2:Javaオブジェクトのシリアル化は、オブジェクトのデータを保持するだけでなく、オブジェクトによって参照される各オブジェクトのデータを再帰的に保存します。

オブジェクト階層全体をバイトストリームに書き込んだり、ファイルに保存したり、ネットワーク接続を介して送信したりできます。オブジェクトのシリアル化は、オブジェクトの「ディープコピー」、つまり、オブジェクト自体と参照されるオブジェクト自体をコピーするために使用できます。オブジェクトをシリアル化すると、オブジェクトのシーケンス全体が取得される場合があります。

3:シリアル化により、メモリ内のクラスをファイルまたはデータベースに書き込むことができます。

例:特定のクラスをシリアル化してファイルとして保存し、次に読み取るときにファイル内のデータを逆シリアル化するだけで、元のクラスをメモリに復元できます。クラスをシリアル化して、送信用のストリーミングデータにすることもできます。

一般に、インスタンス化済みのクラスを保存用のファイルに変換します。次にインスタンス化する必要がある場合は、逆シリアル化してクラスをメモリにインスタンス化し、シリアル化中にクラス内のすべての変数と状態を保持します。

4:オブジェクト、ファイル、データ、さまざまな形式があり、送信とストレージを統合することは困難です。

シリアル化後はバイトストリームです。何でも同じものになり、共通の形式で送信または保存できます。送信が完了した後、再度使用する場合は、このように、オブジェクトはオブジェクトであり、ファイルはファイルです。

3.Javaのシリアル化と逆シリアル化を実装する方法

まず、シリアル化するクラスを準備し、Serializabelインターフェイスを実装する必要があります

例:Personクラスの名前と年齢をシリアル化する必要があります

import java.io.Serializable;


public class Person implements Serializable { //本类可以序列化

  private String name;
  private int age;

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

  public String toString() {
    return "姓名:" + this.name + ",年龄" + this.age;
  }
}

次に、名前と年齢をシリアル化します(つまり、これら2つのオブジェクトをバイナリに変換します。これは「スマッシング」として理解されます)。

package org.lxh.SerDemo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;


public class ObjectOutputStreamDemo { //序列化
  public static void main(String[] args) throws Exception {
    //序列化后生成指定文件路径
    File file = new File("D:" + File.separator + "person.ser");
    ObjectOutputStream oos = null;
    //装饰流(流)
    oos = new ObjectOutputStream(new FileOutputStream(file));

    //实例化类
    Person per = new Person("张三", 30);
    oos.writeObject(per); //把类对象序列化
    oos.close();
  }
}

最新の2020年に収集されたいくつかの高頻度のインタビューの質問(すべてドキュメントにまとめられています)には、mysql、netty、spring、thread、spring cloud、jvm、ソースコード、アルゴリズム、その他の詳細な説明など、多くの乾物があります。詳細な学習計画、インタビュー質問の並べ替えなど。これらのコンテンツを取得する必要がある場合は、次のようなQを追加してください:11604713672

おすすめ

転載: blog.csdn.net/weixin_51495453/article/details/113615819