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

ホームページ Java &#&はじめる Javaでシリアル化する方法

Javaでシリアル化する方法

Nov 12, 2019 pm 05:44 PM
java 連載

Javaでシリアル化する方法

1. シリアル化と逆シリアル化

シリアル化: ヒープ メモリ內(nèi)の Java オブジェクト データを指します。何らかの方法でディスク ファイルにペアを作成するか、他のネットワーク ノードに渡します (ネットワーク送信)。このプロセスはシリアル化と呼ばれ、通常はデータ構(gòu)造またはオブジェクトをバイナリに変換するプロセスを指します。

即將對(duì)象轉(zhuǎn)化為二進(jìn)制,用于保存,或者網(wǎng)絡(luò)傳輸。

デシリアライゼーション: ディスク ファイル內(nèi)のオブジェクト データまたはネットワーク ノード上のオブジェクト データを Java オブジェクト モデルに復(fù)元するプロセス。つまり、シリアル化の過(guò)程で生成されたバイナリ文字列をデータ構(gòu)造またはオブジェクトに変換するプロセスです。

與序列化相反,將二進(jìn)制轉(zhuǎn)化成對(duì)象。

2. シリアル化の役割

① 保存したいメモリ內(nèi)のオブジェクトをファイルまたはデータベースに保存する場(chǎng)合;

② ソケットを使用してネットワーク上でオブジェクトを送信したい場(chǎng)合;

③ RMI 経由でオブジェクトを送信したい場(chǎng)合

一些應(yīng)用場(chǎng)景,涉及到將對(duì)象轉(zhuǎn)化成二進(jìn)制,序列化保證了能夠成功讀取到保存的對(duì)象。

3. Java シリアル化の実裝

オブジェクトのシリアル化を?qū)g現(xiàn)するための最も直接的な操作は、Serializable インターフェイスを?qū)g裝することです

IO ストリームでオブジェクトを使用しますストリームはシリアル化操作を?qū)g裝し、オブジェクトをファイルに保存して、それらを読み出すことができます。

最初にオブジェクトを作成し、Serializable インターフェイスを?qū)g裝します:

import java.io.Serializable;
public class User implements Serializable{
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + "]";
    }
}

オブジェクト ストリームを使用して、オブジェクトの保存と読み取りのためのツール クラスを作成します:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerializeUtil {
    // 保存對(duì)象,序列化
    public static void saveObject(Object object) throws Exception {
        ObjectOutputStream out = null;
        FileOutputStream fout = null;
        try {
            fout = new FileOutputStream("D:/1.txt");
            out = new ObjectOutputStream(fout);
            out.writeObject(object);
        } finally {
            fout.close();
            out.close();
        }
    }
    // 讀取對(duì)象,反序列化
    public static Object readObject() throws Exception {
        ObjectInputStream in = null;
        FileInputStream fin = null;
        try {
            fin = new FileInputStream("D:/1.txt");
            in = new ObjectInputStream(fin);
            Object object = in.readObject();
            return object;
        } finally {
            fin.close();
            in.close();
        }
    }
}

テスト:

public class Main {
    public static void main(String[] args) {
        User user = new User();
        user.setName("旭旭寶寶");
        user.setAge(33);
        // 保存
        try {
            SerializeUtil.saveObject(user);
        } catch (Exception e) {
            System.out.println("保存時(shí)異常:" + e.getMessage());
        }
        // 讀取
        User userObject;
        try {
            userObject = (User) SerializeUtil.readObject();
            System.out.println(userObject);
        } catch (Exception e) {
            System.out.println("讀取時(shí)異常:" + e.getMessage());
        }
    }
}

テスト結(jié)果:

Javaでシリアル化する方法

ここでは、オブジェクトをファイルに保存し、読み出すことに成功しました。この時(shí)點(diǎn)でシリアル化インターフェイスを?qū)g裝しないと、例外が発生します。実裝された Serialiable インターフェイス コードをキャンセルします:

public class User {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + "]";
    }
}

Main メソッドを再度テストします:

Javaでシリアル化する方法

この時(shí)點(diǎn)でエラーが報(bào)告されていることがわかります。e を使用します。 .printStackTrace( );例外の詳細(xì)を表示します:

Javaでシリアル化する方法

不明なソースが表示されます。シリアル化されていないため、保存したり読み取ったりすることはできません。

4. シリアル化 ID の役割

ご覧のとおり、シリアル化するときに、シリアル化 ID である SerialVersionUID フィールドを追加します

private static final long serialVersionUID = 1L;

このシリアル化 ID は重要な役割を果たし、逆シリアル化が成功するかどうかを決定します。 Java のシリアル化メカニズムは、ランタイム クラスの SerialVersionUID を判斷することによってバージョンの一貫性を検証します。逆シリアル化中に、JVM は受信バイト ストリームの SerialVersionUID をローカル エンティティ クラスの SerialVersionUID と比較します。それらが同じである場(chǎng)合、それらは一貫しているとみなされ、そうしないと、シリアル化されたバージョンに一貫性がないという例外が報(bào)告されます。

即序列化ID是為了保證成功進(jìn)行反序列化

5. デフォルトのシリアル化 ID

「serialVersionUID」という名前の変數(shù)を明示的に定義せず、エンティティ クラスに long と入力すると、Java シリアル化メカニズムが自動(dòng)的にシリアル化バージョンの比較として、コンパイルされたクラスに基づいて SerialVersionUID を生成します。この場(chǎng)合、同じコンパイルで生成されたクラスのみが同じ SerialVersionUID を生成します。たとえば、クラスを作成するときに時(shí)間が経つと、要件の変更によりローカル クラスに他のフィールドを追加する必要が生じますが、このとき、デシリアライズ中に SerialVersionUID が不一致になり、デシリアライズが失敗します。では、どうすれば解決できるのでしょうか? 「serialVersionUID」変數(shù)をローカルクラスに追加するだけで、値は変更されず、シリアル化と逆シリアル化を?qū)g行できます。

如果沒有顯示指定serialVersionUID,會(huì)自動(dòng)生成一個(gè)。
只有同一次編譯生成的class才會(huì)生成相同的serialVersionUID。
但是如果出現(xiàn)需求變動(dòng),Bean類發(fā)生改變,則會(huì)導(dǎo)致反序列化失敗。為了不出現(xiàn)這類的問題,所以我們最好還是顯式的指定一個(gè)
serialVersionUID。

6. シリアル化に関するその他の問題

1. 靜的変數(shù)はシリアル化されません (靜的、一時(shí)的)

2. 親がクラスはシリアル化を?qū)g裝し、サブクラスは自動(dòng)的にシリアル化を?qū)g裝するため、Serializable インターフェイスを明示的に実裝する必要はありません。

3. オブジェクトのインスタンス変數(shù)が他のオブジェクトを參照する場(chǎng)合、オブジェクトがシリアル化されると、參照されるオブジェクトもシリアル化されます。

子類序列化時(shí):
如果父類沒有實(shí)現(xiàn)Serializable接口,沒有提供默認(rèn)構(gòu)造函數(shù),那么子類的序列化會(huì)出錯(cuò);
如果父類沒有實(shí)現(xiàn)Serializable接口,提供了默認(rèn)的構(gòu)造函數(shù),那么子類可以序列化,父類的成員變量不會(huì)被序列化。如果父類
實(shí)現(xiàn)了Serializable接口,則父類和子類都可以序列化。

7. より効率的なシリアル化フレームワークを使用する — Protostuff

実際、Java のネイティブ シリアル化メソッド (Serialable インターフェイスの実裝による) はそれほど効率的ではありません。最高ではありません。

シリアル化の効率を分析するためのプロジェクトが github にあります: https://github.com/eishay/jvm-serializers/wiki

Javaでシリアル化する方法

それを見てください。最もパフォーマンスが良いのは Google が開発した Colfer ですが、Colfer は使いにくいため、ほとんどの人が protostuff シリアル化フレームワークを使用しています。フレームワークを適用するには、2 つのライブラリ (コアとランタイム) を?qū)毪工氡匾ⅳ辘蓼埂?

①github アドレス: https://github.com/protostuff/protostuff

③Maven を使用する場(chǎng)合は、依存関係を追加します:

<dependency>
  <groupId>io.protostuff</groupId>
  <artifactId>protostuff-core</artifactId>
  <version>1.5.9</version>
</dependency>
<dependency>
  <groupId>io.protostuff</groupId>
  <artifactId>protostuff-core</artifactId>
  <version>1.5.9</version>
</dependency>

メイン コードを変更

import com.dyuproject.protostuff.LinkedBuffer;
import com.dyuproject.protostuff.ProtobufIOUtil;
import com.dyuproject.protostuff.ProtostuffIOUtil;
import com.dyuproject.protostuff.Schema;
import com.dyuproject.protostuff.runtime.RuntimeSchema;
public class Main {
    public static void main(String[] args) {
        User user = new User();
        user.setName("旭旭寶寶");
        user.setAge(33);
        Schema<User> schema = RuntimeSchema.getSchema(User.class);
        // 保存對(duì)象,序列化,轉(zhuǎn)化二進(jìn)制數(shù)據(jù)
        LinkedBuffer buffer = LinkedBuffer.allocate(512);
        final byte[] protostuff;
        try {
            protostuff = ProtobufIOUtil.toByteArray(user, schema, buffer);
        } finally {
            buffer.clear();
        }
        // 讀取對(duì)象,反序列化
        User userObject = schema.newMessage();
        ProtostuffIOUtil.mergeFrom(protostuff, userObject, schema);
        System.out.println(userObject);
    }
}

User クラスは Serializable インターフェイスを?qū)g裝していません

public class User {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + "]";
    }
}

テスト結(jié)果:

Javaでシリアル化する方法

若要要整合Redis使用,也可以寫成一個(gè)工具類:

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.dyuproject.protostuff.LinkedBuffer;
import com.dyuproject.protostuff.ProtobufIOUtil;
import com.dyuproject.protostuff.Schema;
import com.dyuproject.protostuff.runtime.RuntimeSchema;
public class SerializeUtil {
    private static Map<Class<?>, Schema<?>> cachedSchema = new ConcurrentHashMap<>();
    @SuppressWarnings("unchecked")
    public static <T> byte[] serializer(T obj) {
        Class<T> clazz = (Class<T>) obj.getClass();
        Schema<T> schema = getSchema(clazz);
        return ProtobufIOUtil.toByteArray(obj, schema, LinkedBuffer.allocate(256));
    }
    public static <T> T deSerializer(byte[] bytes, Class<T> clazz) {
        T message;
        try {
            message = clazz.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
        Schema<T> schema = getSchema(clazz);
        ProtobufIOUtil.mergeFrom(bytes, message, schema);
        return message;
    }
    @SuppressWarnings("unchecked")
    public static <T> Schema<T> getSchema(Class<T> clazz) {
        Schema<T> schema = (Schema<T>) cachedSchema.get(clazz);
        if (schema == null) {
            schema = RuntimeSchema.createFrom(clazz);
            if (schema != null) {
                cachedSchema.put(clazz, schema);
            }
        }
        return schema;
    }
}

這樣即使我們的User類就不用再實(shí)現(xiàn)Serialiable接口了,同樣可以進(jìn)行序列化,效率也更高。

php中文網(wǎng),大量的免費(fèi)Java入門教程,歡迎在線學(xué)習(xí)!

以上が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

脫衣畫像を無(wú)料で

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

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

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のSingletonデザインパターンとは何ですか? JavaのSingletonデザインパターンとは何ですか? Jul 09, 2025 am 01:32 AM

JavaのSingleton Design Patternは、クラスに1つのインスタンスしかないことを保証し、プライベートコンストラクターと靜的方法を介したグローバルアクセスポイントを提供することを保証します。これは、共有リソースへのアクセスを制御するのに適しています。実裝方法には以下が含まれます。1。レイジーロード、つまり、インスタンスは最初のリクエストが要求されたときにのみ作成されます。これは、リソースの消費(fèi)が高く、必ずしも必要ではない狀況に適しています。 2。スレッドセーフ処理。同期方法または再確認(rèn)ロックを介して、マルチスレッド環(huán)境で1つのインスタンスのみが作成され、パフォーマンスへの影響が低下するようにします。 3.クラスの読み込み中にインスタンスを直接初期化するHungry Loadingは、事前に初期化できる軽量オブジェクトまたはシナリオに適しています。 4.列挙の実裝は、Java列挙を使用してシリアル化、スレッドの安全性をサポートし、反射攻撃を防止することは、推奨される簡(jiǎn)潔で信頼できる方法です。特定のニーズに応じて、さまざまな実裝方法を選択できます

Javaヒープダンプを分析する方法は? Javaヒープダンプを分析する方法は? Jul 09, 2025 am 01:25 AM

Java Heap Dumpsの分析は、特にメモリリークとパフォーマンスのボトルネックを特定するためのメモリの問題をトラブルシューティングする重要な手段です。 1. eclipsematまたはvisualvmを使用して、.hprofファイルを開きます。 MATは、異なる角度からオブジェクト分布を表示するヒストグラムとドミネーターツリービューを提供します。 2。バイト[]、char []、またはビジネスクラスなどの異常に大きいまたは大きいサイズのクラスを見つけるために、占有されているインスタンスの數(shù)またはスペースでヒストグラムを並べ替えます。 3.「ListObjects> Incoming/Outverneferences」を介して參照チェーンを表示して、誤って保持されているかどうかを判斷します。 4?!窹athto」を使用します

JavaのThreadlocalとは何ですか? JavaのThreadlocalとは何ですか? Jul 09, 2025 am 02:25 AM

ThreadlocalはJavaで使用されてスレッドプライベート変數(shù)を作成します。各スレッドには、同時(shí)実行の問題を回避するための獨(dú)立したコピーがあります。スレッド內(nèi)のthreadlocalMapを介して値を保存します。メモリの漏れを防ぐために使用するときは、タイムリーなクリーニングに注意してください。一般的な用途には、ユーザーセッション管理、データベース接続、トランザクションコンテキスト、ログトラッキングが含まれます。ベストプラクティスには以下が含まれます。1。remove()を呼び出して、使用後にクリーンアップします。 2。過(guò)剰使用を避けます。 3.継承は、子スレッドの継承に必要です。 4.大きなオブジェクトを保存しないでください。初期値はinitialValue()またはintheritial()を介して設(shè)定でき、初期化は最初のget()呼び出しまで遅延します。

Javaオプションの例 Javaオプションの例 Jul 12, 2025 am 02:55 AM

オプションは、意図を明確に表現(xiàn)し、ヌルの判斷のコードノイズを減らすことができます。 1. optional.ofnullableは、nullオブジェクトに対処する一般的な方法です。たとえば、マップから値を取得する場(chǎng)合、Orelseを使用してデフォルト値を提供できるため、ロジックはより明確かつ簡(jiǎn)潔になります。 2.チェーンコールマップを使用してネストされた値を達(dá)成してNPEを安全に回避し、リンクが無(wú)効である場(chǎng)合はデフォルト値を返す場(chǎng)合は自動(dòng)的に終了します。 3.フィルターは條件付きフィルタリングに使用でき、その後の操作は條件が満たされた場(chǎng)合にのみ実行され続けます。そうしないと、軽量のビジネス判斷に適したOrelseに直接ジャンプします。 4.基本的なタイプや単純なロジックなど、複雑さを高めるなど、オプションを過(guò)剰使用することはお?jiǎng)幛幛筏蓼护?。一部のシナリオはNUに直接戻ります。

java.io.notserializableExceptionを修正する方法は? java.io.notserializableExceptionを修正する方法は? Jul 12, 2025 am 03:07 AM

java.io.notserializableExceptionに遭遇するためのコアワークアウンドは、シリアル化する必要があるすべてのクラスがシリアル化可能なインターフェイスを?qū)g裝し、ネストされたオブジェクトのシリアル化サポートを確認(rèn)することです。 1.メインクラスに機(jī)器を追加する可能性のあるものを追加します。 2.クラス內(nèi)の対応するカスタムフィールドのクラスも、シリアル化可能なものを?qū)g裝していることを確認(rèn)します。 3.一時(shí)的に使用して、シリアル化する必要のないフィールドをマークする。 4.コレクションまたはネストされたオブジェクトの非シリアル化されたタイプを確認(rèn)します。 5.どのクラスがインターフェイスを?qū)g裝していないかを確認(rèn)します。 6.キーデータの保存やシリアル化可能な中間構(gòu)造の使用など、変更できないクラスの交換設(shè)計(jì)を検討します。 7.変更を検討してください

Javaのマップを反復(fù)する方法は? Javaのマップを反復(fù)する方法は? Jul 13, 2025 am 02:54 AM

Javaにはマップを通過(guò)する3つの一般的な方法があります。1。エントリセットを使用してキーと値を同時(shí)に取得します。これは、ほとんどのシナリオに適しています。 2。キーセットまたは値をそれぞれキーまたは値を通過(guò)する。 3. Java8のForeachを使用して、コード構(gòu)造を簡(jiǎn)素化します。 EntrySetは、すべてのキー値ペアを含むセットを返し、各ループはキーと値に頻繁にアクセスするのに適したMap.entryオブジェクトを取得します。キーまたは値のみが必要な場(chǎng)合は、それぞれkeyset()またはvalues()を呼び出すことができます。または、キーを橫斷するときにmap.get(key)を介して値を取得できます。 Java 8はForeachを使用できます((key、value) - &gt

Javaでキャッシュ戦略を?qū)g裝する方法(たとえば、ehcacheやカフェインを使用)? Javaでキャッシュ戦略を?qū)g裝する方法(たとえば、ehcacheやカフェインを使用)? Jul 09, 2025 am 01:17 AM

InjavaApplicationsを改善するために、Choedeehcacheandcaffeinebasedonyeads.1を選択します。1

Python Webスクレイピングダイナミックコンテンツ Python Webスクレイピングダイナミックコンテンツ Jul 10, 2025 pm 12:18 PM

ダイナミックウェブクロールは、分析インターフェイスまたはシミュレートされたブラウザを通じて実現(xiàn)できます。 1.ブラウザ開発者ツールを使用して、ネットワーク內(nèi)のXHR/Fetchリクエストを表示し、JSONデータを返すインターフェイスを見つけ、リクエストを使用してそれを取得します。 2.ページがフロントエンドフレームワークによってレンダリングされ、獨(dú)立したインターフェイスがない場(chǎng)合、Seleniumでブラウザを起動(dòng)して、要素をロードして抽出するのを待つことができます。 3。アンチクロールメカニズムに直面して、ヘッダーを追加し、周波數(shù)制御、プロキシIPを使用する必要があり、検証コードまたはJSレンダリング検出は、狀況に応じて実行する必要があります。これらの方法をマスターすると、ほとんどの動(dòng)的なWebクロールシナリオに効果的に対処できます。

See all articles