国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ Java &#&ベース Java オブジェクトのシリアル化と逆シリアル化について説明します。

Java オブジェクトのシリアル化と逆シリアル化について説明します。

Jul 03, 2020 am 10:03 AM
Javaオブジェクト 逆シリアル化 連載

Java オブジェクトのシリアル化と逆シリアル化について説明します。

1. シリアル化と逆シリアル化の概念

オブジェクトをプロセスに変換するバイト列のシリアル化をオブジェクトのシリアル化と呼びます。

バイト シーケンスをオブジェクトに復(fù)元するプロセスは、オブジェクトの逆シリアル化と呼ばれます。

オブジェクトのシリアル化には 2 つの主な用途があります:

1) オブジェクトのバイト シーケンスを ハードディスク (通常はファイル) に永続的に保存します。 #2) オブジェクトのバイト列をネットワーク経由で送信します。

多くのアプリケーションでは、特定のオブジェクトをメモリ空間から離れて物理ハードディスクに移動(dòng)して長(zhǎng)期保存できるように、シリアル化する必要があります。たとえば、最も一般的なのは Web サーバー內(nèi)の Session オブジェクトです。100,000 人のユーザーが同時(shí)にアクセスすると、100,000 個(gè)の Session オブジェクトが存在する可能性があり、これではメモリが多すぎる可能性があるため、Web コンテナは一部のセッションをハードウェアにシリアル化します。使用する場(chǎng)合は、ハードディスクに保存されているオブジェクトをメモリに復(fù)元します。

2 つのプロセスがリモートで通信している場(chǎng)合、さまざまな種類のデータを相互に送信できます。データの種類に関係なく、データはバイナリ シーケンスの形式でネットワーク上に送信されます。送信者は、ネットワーク経由で送信する前に、この Java オブジェクトをバイト シーケンスに変換する必要があり、受信者は、バイト シーケンスを Java オブジェクトに復(fù)元する必要があります。

2. JDK クラス ライブラリのシリアル化 API java.io.ObjectOutputStream はオブジェクト出力ストリームとその writeObject(Object obj ) を表します。このメソッドは、パラメーターで指定された obj オブジェクトをシリアル化し、結(jié)果のバイト シーケンスをターゲットの出力ストリームに書き込むことができます。

java.io.ObjectInputStream はオブジェクト入力ストリームを表し、その readObject() メソッドはソース入力ストリームからバイトのシーケンスを読み取り、オブジェクトに逆シリアル化してそれを返します。

Serializable および Externalizable インターフェイスを?qū)g裝するクラスのオブジェクトのみをシリアル化できます。外部化可能なインターフェイスは以下から継承します Serializable インターフェイス: Externalizable インターフェイスを?qū)g裝するクラスは、それ自體でシリアル化動(dòng)作を完全に制御しますが、Serializable インターフェイスのみを?qū)g裝するクラスは、 デフォルトのシリアル化方法を使用します。
オブジェクトのシリアル化には次の手順が含まれます:
1) ファイル出力ストリームなど、他のタイプのターゲット出力ストリームをラップできるオブジェクト出力ストリームを作成します;
2) の writeObject() を通じて、オブジェクト出力ストリーム メソッドはオブジェクトを書き込みます。

オブジェクトの逆シリアル化の手順は次のとおりです:
1) ファイル入力ストリームなどの他のタイプのソース入力ストリームをラップできるオブジェクト入力ストリームを作成します;
2) パスオブジェクト入力ストリーム readObject() メソッドはオブジェクトを読み取ります。

オブジェクトのシリアル化と逆シリアル化の例:

パーソン クラスを定義し、シリアル化可能なインターフェイスを?qū)g裝します

import java.io.Serializable;

/**
 * <p>ClassName: Person<p>
 * <p>Description:測(cè)試對(duì)象序列化和反序列化<p>
 * @author xudp
 * @version 1.0 V
 * @createTime 2014-6-9 下午02:33:25
 */
public class Person implements Serializable {

    /**
     * 序列化ID
     */
    private static final long serialVersionUID = -5809782578272943999L;
    private int age;
    private String name;
    private String sex;

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public String getSex() {
        return sex;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

シリアル化パーソン クラス オブジェクトを逆シリアル化します。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.MessageFormat;

/**
 * <p>ClassName: TestObjSerializeAndDeserialize<p>
 * <p>Description: 測(cè)試對(duì)象的序列化和反序列<p>
 * @author xudp
 * @version 1.0 V
 * @createTime 2014-6-9 下午03:17:25
 */
public class TestObjSerializeAndDeserialize {

    public static void main(String[] args) throws Exception {
        SerializePerson();//序列化Person對(duì)象
        Person p = DeserializePerson();//反序列Perons對(duì)象
        System.out.println(MessageFormat.format("name={0},age={1},sex={2}",
                                                 p.getName(), p.getAge(), p.getSex()));
    }

    /**
     * MethodName: SerializePerson
     * Description: 序列化Person對(duì)象
     * @author xudp
     * @throws FileNotFoundException
     * @throws IOException
     */
    private static void SerializePerson() throws FileNotFoundException,
            IOException {
        Person person = new Person();
        person.setName("gacl");
        person.setAge(25);
        person.setSex("男");
        // ObjectOutputStream 對(duì)象輸出流,將Person對(duì)象存儲(chǔ)到E盤的Person.txt文件中,完成對(duì)Person對(duì)象的序列化操作
        ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(
                new File("E:/Person.txt")));
        oo.writeObject(person);
        System.out.println("Person對(duì)象序列化成功!");
        oo.close();
    }

    /**
     * MethodName: DeserializePerson
     * Description: 反序列Perons對(duì)象
     * @author xudp
     * @return
     * @throws Exception
     * @throws IOException
     */
    private static Person DeserializePerson() throws Exception, IOException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
                new File("E:/Person.txt")));
        Person person = (Person) ois.readObject();
        System.out.println("Person對(duì)象反序列化成功!");
        return person;
    }

}

コードの実行結(jié)果は次のとおりです。

Java オブジェクトのシリアル化と逆シリアル化について説明します。パーソンを正常にシリアル化した後.txt ファイルが E ドライブ上に生成され、デシリアライズされた person は E ドライブの person.txt を読み取った後、Person オブジェクトを生成します

##3。serialVersionUID の役割

#serialVersionUID: 文字通りシリアル化されたバージョン番號(hào)を意味します。Serializable インターフェイスを?qū)g裝するすべてのクラスには、シリアル化されたバージョン識(shí)別子を表す靜的変數(shù)があります

private static final long serialVersionUID
Serializable インターフェイスを?qū)g裝するクラスが、serialVersionUID をクラスに追加しない場(chǎng)合、次の警告が表示されます。


マウスでクリックして生成するダイアログ ボックス以下に示すように、serialVersionUID がポップアップ表示されます:

Java オブジェクトのシリアル化と逆シリアル化について説明します。

serialVersionUID を生成するには 2 つの方法があります:

Java オブジェクトのシリアル化と逆シリアル化について説明します。

Use

thisこのメソッドは 1L です。例:

private static final long serialVersionUID = 1L;

によって生成された SerialVersionUID は、クラス名、インターフェイス名、メソッド、屬性などに基づいています。例:

private static final long serialVersionUID = 4603642343377807741L;

Afterこれを追加すると、以下に示すように、警告プロンプトは表示されなくなります:


ところで、serialVersionUID (シリアル化されたバージョン番號(hào)) は何ですか? 何の役に立つのですか?次の例を使用して、serialVersionUID の役割を説明します。次のコードを見てください:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class TestSerialversionUID {

    public static void main(String[] args) throws Exception {
        SerializeCustomer();// 序列化Customer對(duì)象
        Customer customer = DeserializeCustomer();// 反序列Customer對(duì)象
        System.out.println(customer);
    }

    /**
     * MethodName: SerializeCustomer
     * Description: 序列化Customer對(duì)象
     * @author xudp
     * @throws FileNotFoundException
     * @throws IOException
     */
    private static void SerializeCustomer() throws FileNotFoundException,
            IOException {
        Customer customer = new Customer("gacl",25);
        // ObjectOutputStream 對(duì)象輸出流
        ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(
                new File("E:/Customer.txt")));
        oo.writeObject(customer);
        System.out.println("Customer對(duì)象序列化成功!");
        oo.close();
    }

    /**
     * MethodName: DeserializeCustomer
     * Description: 反序列Customer對(duì)象
     * @author xudp
     * @return
     * @throws Exception
     * @throws IOException
     */
    private static Customer DeserializeCustomer() throws Exception, IOException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
                new File("E:/Customer.txt")));
        Customer customer = (Customer) ois.readObject();
        System.out.println("Customer對(duì)象反序列化成功!");
        return customer;
    }
}

/**
 * <p>ClassName: Customer<p>
 * <p>Description: Customer實(shí)現(xiàn)了Serializable接口,可以被序列化<p>
 * @author xudp
 * @version 1.0 V
 * @createTime 2014-6-9 下午04:20:17
 */
class Customer implements Serializable {
    //Customer類中沒有定義serialVersionUID
    private String name;
    private int age;

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

    /*
     * @MethodName toString
     * @Description 重寫Object類的toString()方法
     * @author xudp
     * @return string
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "name=" + name + ", age=" + age;
    }
}
Java オブジェクトのシリアル化と逆シリアル化について説明します。 実行結(jié)果:

Java オブジェクトのシリアル化と逆シリアル化について説明します。Java オブジェクトのシリアル化と逆シリアル化について説明します。

序列化和反序列化都成功了。

下面我們修改一下Customer類,添加多一個(gè)sex屬性,如下:

class Customer implements Serializable {
    //Customer類中沒有定義serialVersionUID
    private String name;
    private int age;

    //新添加的sex屬性
    private String sex;

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

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

    /*
     * @MethodName toString
     * @Description 重寫Object類的toString()方法
     * @author xudp
     * @return string
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "name=" + name + ", age=" + age;
    }
}

然后執(zhí)行反序列操作,此時(shí)就會(huì)拋出如下的異常信息:

1 Exception in thread "main" java.io.InvalidClassException: Customer; 
2 local class incompatible: 
3 stream classdesc serialVersionUID = -88175599799432325, 
4 local class serialVersionUID = -5182532647273106745

意思就是說,文件流中的class和classpath中的class,也就是修改過后的class,不兼容了,處于安全機(jī)制考慮,程序拋出了錯(cuò)誤,并且拒絕載入。那么如果我們真的有需求要在序列化后添加一個(gè)字段或者方法呢?應(yīng)該怎么辦?那就是自己去指定serialVersionUID。在TestSerialversionUID例子中,沒有指定Customer類的serialVersionUID的,那么java編譯器會(huì)自動(dòng)給這個(gè)class進(jìn)行一個(gè)摘要算法,類似于指紋算法,只要這個(gè)文件 多一個(gè)空格,得到的UID就會(huì)截然不同的,可以保證在這么多類中,這個(gè)編號(hào)是唯一的。所以,添加了一個(gè)字段后,由于沒有顯指定 serialVersionUID,編譯器又為我們生成了一個(gè)UID,當(dāng)然和前面保存在文件中的那個(gè)不會(huì)一樣了,于是就出現(xiàn)了2個(gè)序列化版本號(hào)不一致的錯(cuò)誤。因此,只要我們自己指定了serialVersionUID,就可以在序列化后,去添加一個(gè)字段,或者方法,而不會(huì)影響到后期的還原,還原后的對(duì)象照樣可以使用,而且還多了方法或者屬性可以用。

下面繼續(xù)修改Customer類,給Customer指定一個(gè)serialVersionUID,修改后的代碼如下:

class Customer implements Serializable {
    /**
     * Customer類中定義的serialVersionUID(序列化版本號(hào))
     */
    private static final long serialVersionUID = -5182532647273106745L;
    private String name;
    private int age;

    //新添加的sex屬性
    //private String sex;

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

    /*public Customer(String name, int age,String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }*/

    /*
     * @MethodName toString
     * @Description 重寫Object類的toString()方法
     * @author xudp
     * @return string
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "name=" + name + ", age=" + age;
    }
}

重新執(zhí)行序列化操作,將Customer對(duì)象序列化到本地硬盤的Customer.txt文件存儲(chǔ),然后修改Customer類,添加sex屬性,修改后的Customer類代碼如下:

class Customer implements Serializable {
    /**
     * Customer類中定義的serialVersionUID(序列化版本號(hào))
     */
    private static final long serialVersionUID = -5182532647273106745L;
    private String name;
    private int age;

    //新添加的sex屬性
    private String sex;

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

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

    /*
     * @MethodName toString
     * @Description 重寫Object類的toString()方法
     * @author xudp
     * @return string
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "name=" + name + ", age=" + age;
    }
}

執(zhí)行反序列操作,這次就可以反序列成功了,如下所示:

Java オブジェクトのシリアル化と逆シリアル化について説明します。

四、serialVersionUID的取值

serialVersionUID的取值是Java運(yùn)行時(shí)環(huán)境根據(jù)類的內(nèi)部細(xì)節(jié)自動(dòng)生成的。如果對(duì)類的源代碼作了修改,再重新編譯,新生成的類文件的serialVersionUID的取值有可能也會(huì)發(fā)生變化。

類的serialVersionUID的默認(rèn)值完全依賴于Java編譯器的實(shí)現(xiàn),對(duì)于同一個(gè)類,用不同的Java編譯器編譯,有可能會(huì)導(dǎo)致不同的 serialVersionUID,也有可能相同。為了提高serialVersionUID的獨(dú)立性和確定性,強(qiáng)烈建議在一個(gè)可序列化類中顯示的定義serialVersionUID,為它賦予明確的值。

顯式地定義serialVersionUID有兩種用途:

1、 在某些場(chǎng)合,希望類的不同版本對(duì)序列化兼容,因此需要確保類的不同版本具有相同的serialVersionUID;

2、 在某些場(chǎng)合,不希望類的不同版本對(duì)序列化兼容,因此需要確保類的不同版本具有不同的serialVersionUID。

推薦學(xué)習(xí):Java視頻教程

以上がJava オブジェクトのシリアル化と逆シリアル化について説明します。の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java オブジェクトの作成プロセスとは何ですか? Java オブジェクトの作成プロセスとは何ですか? Apr 11, 2024 pm 12:51 PM

Java オブジェクトの作成には、次の手順が含まれます。 クラスのロード: クラスのバイナリ コードをロードします。メモリ割り當(dāng)て: ヒープ メモリ內(nèi)のオブジェクトにメモリ領(lǐng)域を割り當(dāng)てます。インスタンス化: 割り當(dāng)てられたメモリ空間にオブジェクトの新しいインスタンスを作成します。初期化: オブジェクトのインスタンス変數(shù)をデフォルト値で初期化します。コンストラクター呼び出し: 適切なコンストラクターが呼び出され、オブジェクトの殘りのフィールドが初期化されます。

PHP データ処理スキル: シリアル化関數(shù)とアンシリアル化関數(shù)を使用してデータのシリアル化と逆シリアル化を?qū)g裝する方法 PHP データ処理スキル: シリアル化関數(shù)とアンシリアル化関數(shù)を使用してデータのシリアル化と逆シリアル化を?qū)g裝する方法 Jul 29, 2023 am 10:49 AM

PHP データ処理スキル: シリアル化関數(shù)とアンシリアル化関數(shù)を使用してデータのシリアル化と逆シリアル化を?qū)g裝する方法 シリアル化と逆シリアル化は、コンピューター サイエンスで一般的に使用されるデータ処理スキルの 1 つです。 PHP では、serialize() 関數(shù)と unserialize() 関數(shù)を使用して、データのシリアル化と逆シリアル化の操作を?qū)g裝できます。この記事では、これら 2 つの関數(shù)の使用方法を詳しく紹介し、関連するコード例を示します。 1. コンピューター プログラミングにおけるシリアル化とデシリアル化とは何ですか?

PHPのデシリアライズ失敗を解決する方法 PHPのデシリアライズ失敗を解決する方法 Oct 11, 2023 am 09:30 AM

PHP デシリアライズ失敗の解決策 シリアライズされたデータを確認(rèn)してください。クラス定義の確認(rèn)、エラーログの確認(rèn)、PHPのバージョンアップ、セキュリティ対策などを行います。詳細(xì)な紹介: 1. シリアル化されたデータを確認(rèn)します。まず、シリアル化されたデータが有効であり、PHP のシリアル化仕様に準(zhǔn)拠しているかどうかを確認(rèn)します。データが破損しているか、形式が正しくない場(chǎng)合は、修復(fù)するか、バックアップから正しいデータを復(fù)元してください。 2. クラス定義を確認(rèn)し、シリアル化されたデータで使用されているすべてのクラスが存在し、自動(dòng)的にロードできることを確認(rèn)します。クラスが存在しないかアクセスできない場(chǎng)合は、クラス定義の修復(fù)などを試みることができます。

Java では、flexjson を使用してオブジェクトのリストをシリアル化するにはどうすればよいでしょうか? Java では、flexjson を使用してオブジェクトのリストをシリアル化するにはどうすればよいでしょうか? Sep 05, 2023 pm 11:09 PM

Flexjson は、Java オブジェクトを JSON 形式にシリアル化および逆シリアル化するための軽量ライブラリです。 JSONSerializer クラスの Serialize() メソッドを使用して、オブジェクトのリストをシリアル化できます。このメソッドは、ターゲット インスタンスで淺いシリアル化を?qū)g行します。リスト型のオブジェクトのリストをパラメータとして Serialize() メソッドに渡す必要があります。構(gòu)文 publicStringserialize(Objecttarget) 例 importflexjson.JSONSerializer;importjava.util.*;publicclassJsonSerial

C++ 関數(shù)ライブラリはシリアル化と逆シリアル化をどのように実行しますか? C++ 関數(shù)ライブラリはシリアル化と逆シリアル化をどのように実行しますか? Apr 18, 2024 am 10:06 AM

C++ ライブラリのシリアル化および逆シリアル化ガイド シリアル化: 出力ストリームの作成とアーカイブ形式への変換。オブジェクトをシリアル化してアーカイブします。逆シリアル化: 入力ストリームを作成し、アーカイブ形式から復(fù)元します。アーカイブからオブジェクトを逆シリアル化します。実踐例: シリアル化: 出力ストリームの作成。アーカイブ オブジェクトを作成します。オブジェクトを作成してアーカイブにシリアル化します。逆シリアル化: 入力ストリームを作成します。アーカイブ オブジェクトを作成します。オブジェクトを作成し、アーカイブから逆シリアル化します。

MyBatis の実行プロセスを 1 つの図で理解する: SQL を Java オブジェクトにマッピングするプロセス MyBatis の実行プロセスを 1 つの図で理解する: SQL を Java オブジェクトにマッピングするプロセス Feb 22, 2024 pm 04:33 PM

MyBatis は、Java アプリケーションでデータベースと対話するプロセスを簡(jiǎn)素化し、開発効率を大幅に向上させる優(yōu)れた永続層フレームワークです。 MyBatis フレームワークの中心となるアイデアは、SQL ステートメントを Java オブジェクトにマップし、XML 構(gòu)成ファイルまたは注釈を介して SQL マッピングを?qū)g裝することで、データベース操作を簡(jiǎn)単に実行できるようにすることです。 MyBatis では、SQL を Java オブジェクトにマッピングするプロセスは、SQL マッピング ファイルの設(shè)定、Java オブジェクトの定義、および

JavaのJacksonライブラリを使用してプロパティの順序をシリアル化するにはどうすればよいですか? JavaのJacksonライブラリを使用してプロパティの順序をシリアル化するにはどうすればよいですか? Aug 28, 2023 pm 12:45 PM

@JsonPropertyOrder はクラスレベルで使用されるアノテーションです。これは、オブジェクトの JSON シリアル化によって生成された文字列內(nèi)にフィールドが表示される順序を定義するフィールドのリストを?qū)傩预趣筏剖埭比·辘蓼?。アノテーション宣言に含まれるプロパティを最初に (定義された順序で) シリアル化し、その後に定義に含まれていないプロパティをシリアル化することができます。構(gòu)文 public@interfaceJsonPropertyOrder 例 importcom.fasterxml.jackson.core.*;importcom.fasterxml.jackson.databind.*;importcom.fasterxml.jac

Java のシリアル化はパフォーマンスにどのような影響を與えますか? Java のシリアル化はパフォーマンスにどのような影響を與えますか? Apr 16, 2024 pm 06:36 PM

Java パフォーマンスに対するシリアル化の影響: シリアル化プロセスはリフレクションに依存しているため、パフォーマンスに大きな影響を與えます。シリアル化では、オブジェクト データを保存するためのバイト ストリームの作成が必要となり、メモリ割り當(dāng)てと処理コストが発生します。大きなオブジェクトをシリアル化すると、大量のメモリと時(shí)間が消費(fèi)されます。シリアル化されたオブジェクトは、ネットワーク経由で送信されるときに負(fù)荷を増加させます。

See all articles