カスタムシリアル化によるJavaオブジェクトの外部化のシミュレーション

スレン・アズナウリアン

シリアル化に対する外部化の主な利点は、外部化がオブジェクトの一部のみを保持し、シリアル化の場合のようにオブジェクト全体を保持しないことです。しかし、私たちは呼んでない場合、我々は、カスタムのシリアル化を経由して外部化をシミュレートすることができると思いますdefaultWriteObject()のメソッドにObjectOutputStreamのwriteObject()直列化可能クラスのメソッドを。したがって、defaultWriteObject ()メソッドを呼び出しずwriteObject()メソッドでシリアル化可能なクラスの必要なインスタンス変数のみを永続化することなく、外部化の利点を実現できます。

前述のことを示す例を次に示します。

package com.test;

import java.io.*;

public class Test {
    public static void main(String[] args) throws FileNotFoundException,     IOException, ClassNotFoundException {
        Dog dog = new Dog();
        System.out.println("before serialization: i = " + dog.i + ", j = " +     dog.j);

        FileOutputStream fos = new FileOutputStream("abc.ser");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(dog);

        FileInputStream fis = new FileInputStream("abc.ser");
        ObjectInputStream ois = new ObjectInputStream(fis);
        Dog dog2 = (Dog) ois.readObject();
        System.out.println("after deserialization: i = " + dog2.i + ", j = " +      dog2.j);

    }

    public static class Dog implements Serializable {
        int i = 10;
        int j = 20;

        private void writeObject(ObjectOutputStream oos) throws IOException{
            //oos.defaultWriteObject();
            System.out.println("In WriteObject");
            oos.writeInt(i);
        }

        private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
            //ois.defaultReadObject();
            System.out.println("In ReadObject");
            i = ois.readInt();
        }
    }
}

このコードの出力は次のとおりです。

before serialization: i = 10, j = 20
In WriteObject
In ReadObject
after deserialization: i = 10, j = 0

ご覧のとおり、oos.defaultWriteObject()ois.defaultReadObject();はコメント化されており、インスタンス変数のみを永続化して復元しますi

それで、カスタムシリアル化を介して外部化の概念をシミュレートできるという私の仮定は正しいですか?

scottb

それで、カスタムシリアル化を介して外部化の概念をシミュレートできるという私の仮定は正しいですか?

あなたの仮定は、プログラマーが彼が選択したクラスのシリアル化されたフォームを構築する能力を持っているということです。

このSerializableインターフェースは、実装クラスに対してJavaベースのシリアル化が有効になっていることをJavaランタイム環境に通知するマーカーインターフェースです。他に何もしない場合、Javaランタイムはデフォルトのシリアル化機能を呼び出し、クラスのすべてのインスタンスフィールドからシリアル化されたフォームを作成します。

クラスに最適なシリアル化された形式は、次のいずれかです。

  • インスタンスの論理状態のみを記述します
  • 実装固有の詳細やメタデータは含まれていません
  • クラスインスタンスのストリーミングと復元に必要な最小限の情報の書き込みと読み取り

たとえば、上記のコードでは、両方の場合ij、あなたのオブジェクトの意味のある状態を説明し、その後、含まれていませんでした直列化された形式は、jあなたが逆シリアル化後にその意味のある状態にオブジェクトを復元することはできませんので、欠陥があるでしょう。

ただし、i意味のある状態を記述しjているが、オブジェクトの論理状態の一部ではない実装の詳細である場合はj、より最適なシリアル化された形式を取得するために、ストリームから削除することをお勧めします。

デフォルトのシリアル化されたフォーム(組み込みのJavaシリアル化機能によって発行される)は、単純な値クラスには十分であることがよくありますが、より高度な抽象化には、シリアル化されたフォームの一部になるべきではないメタデータと実装情報が含まれます。

プログラマーがクラスに最適なシリアル化されたフォームを設計できるようにするために(デフォルトのフォームが適切でない場合)、Javaは、オブジェクトに最適なシリアル化されたフォームを生成するための2つの広範なメカニズムを提供します。

  • カスタマイズされたシリアル化
  • Externalizableインターフェース

かつての戦略は、プログラマが内蔵されたJavaのシリアライズ機能使用しての行動変更することができますtransientキーワードを、とのような方法にフックreadObject()writeObject()readResolve()シリアル化プロキシの使用は、特にその必要不可欠不変条件と不変値のクラスのために推奨される、など保護されます。

後者の戦略では、それ自体が拡張する)のExternalizable代わりにプログラマーが実装します。異なりインターフェイスは、マーカーインターフェイスではありません。そのメソッドは、実装されると、オブジェクトのシリアル化されたフォームがどのように発行および復元されるかをプログラマーが完全に制御できるようにすることを目的としています。SerializableExternalizableSerializableExternalizableSerializable

「シリアル化に対する外部化の主な利点は、シリアル化の場合のようにオブジェクト全体ではなく、オブジェクトの一部のみが永続化されることです。」

「オブジェクトの一部」のみを含み、シリアル化される前に存在していたオブジェクトの状態を再構成するために必要なすべての情報を含まないシリアル化されたフォームは、欠陥のあるシリアル化されたフォームです。このような形式は、プロセス間通信をシリアル化に依存しているプラ​​ットフォームで問題を引き起こすことが予想されます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

完全に元のタイプのオブジェクトに逆シリアル化するのに役立つカスタムJSONコンバーター

分類Dev

RXJSサブジェクトのサブスクライブ-アクションはプレーンオブジェクトである必要があります。非同期アクションにカスタムミドルウェアを使用する

分類Dev

GSON:カスタムオブジェクトの逆シリアル化

分類Dev

カスタムオブジェクトのシリアル化とPreserveReferencesHandling

分類Dev

Django:カスタムオブジェクトのjsonシリアル化

分類Dev

ジャクソンの逆シリアル化:カスタムオブジェクトファクトリ

分類Dev

DjangoREST-オブジェクト/外部キーをシリアル化するフレームワークの方法

分類Dev

reduxミドルウェアの問題-エラー:アクションはプレーンオブジェクトでなければなりません。非同期アクションにカスタムミドルウェアを使用する

分類Dev

jacksonを使用してカスタムオブジェクトのHashMapに逆シリアル化する

分類Dev

オブジェクトをフラット化するためのJacksonカスタムシリアル化

分類Dev

オブジェクトのコレクションのシリアル化と逆シリアル化

分類Dev

スプレーjsonによるScalaケースオブジェクトのJson逆シリアル化

分類Dev

jsonオブジェクト内のカスタムオブジェクトをシリアル化します

分類Dev

外部Webサービス、XMLを.NETのクラスオブジェクトに逆シリアル化する

分類Dev

SQLテーブルをオブジェクトコレクションに逆シリアル化する

分類Dev

アプリケーションが「アクションはプレーンオブジェクトである必要があり、非同期アクションにはカスタムミドルウェアを使用する」を返すのはなぜですか

分類Dev

このエラーが発生します。アクションはプレーンオブジェクトである必要があります。非同期アクションにカスタムミドルウェアを使用する

分類Dev

オブジェクトをシリアル化するときに応じて、Javaの静的デシリアライゼーションの差

分類Dev

ManyToManyリレーションがタイムアウトしたSymfony5オブジェクトのシリアル化

分類Dev

現在のJSONオブジェクト(例:{"name": "value"})をリストのコレクションタイプに逆シリアル化できません

分類Dev

オブジェクトのリストを別のコレクションタイプに逆シリアル化します

分類Dev

カスタムファイルタイプのバイトストリームを.NetCoreのPOCOオブジェクトに逆シリアル化します

分類Dev

JQueryを使用してカスタムオブジェクトの配列をシリアル化および逆シリアル化します

分類Dev

AndroidプロジェクトのローカルストレージにProtoオブジェクトをシリアル化/逆シリアル化するにはどうすればよいですか?

分類Dev

ジュリア:単純な動的システムのシミュレーションを最適化する

分類Dev

ターミナルシミュレーションによるシェルスクリプトテスト

分類Dev

統一されたカスタムオブジェクトのリストのシリアル化

分類Dev

(WebApi)オブジェクトのコレクションをJsonにシリアル化できません

分類Dev

KafkaコンシューマーからのJavaオブジェクトの逆シリアル化

Related 関連記事

  1. 1

    完全に元のタイプのオブジェクトに逆シリアル化するのに役立つカスタムJSONコンバーター

  2. 2

    RXJSサブジェクトのサブスクライブ-アクションはプレーンオブジェクトである必要があります。非同期アクションにカスタムミドルウェアを使用する

  3. 3

    GSON:カスタムオブジェクトの逆シリアル化

  4. 4

    カスタムオブジェクトのシリアル化とPreserveReferencesHandling

  5. 5

    Django:カスタムオブジェクトのjsonシリアル化

  6. 6

    ジャクソンの逆シリアル化:カスタムオブジェクトファクトリ

  7. 7

    DjangoREST-オブジェクト/外部キーをシリアル化するフレームワークの方法

  8. 8

    reduxミドルウェアの問題-エラー:アクションはプレーンオブジェクトでなければなりません。非同期アクションにカスタムミドルウェアを使用する

  9. 9

    jacksonを使用してカスタムオブジェクトのHashMapに逆シリアル化する

  10. 10

    オブジェクトをフラット化するためのJacksonカスタムシリアル化

  11. 11

    オブジェクトのコレクションのシリアル化と逆シリアル化

  12. 12

    スプレーjsonによるScalaケースオブジェクトのJson逆シリアル化

  13. 13

    jsonオブジェクト内のカスタムオブジェクトをシリアル化します

  14. 14

    外部Webサービス、XMLを.NETのクラスオブジェクトに逆シリアル化する

  15. 15

    SQLテーブルをオブジェクトコレクションに逆シリアル化する

  16. 16

    アプリケーションが「アクションはプレーンオブジェクトである必要があり、非同期アクションにはカスタムミドルウェアを使用する」を返すのはなぜですか

  17. 17

    このエラーが発生します。アクションはプレーンオブジェクトである必要があります。非同期アクションにカスタムミドルウェアを使用する

  18. 18

    オブジェクトをシリアル化するときに応じて、Javaの静的デシリアライゼーションの差

  19. 19

    ManyToManyリレーションがタイムアウトしたSymfony5オブジェクトのシリアル化

  20. 20

    現在のJSONオブジェクト(例:{"name": "value"})をリストのコレクションタイプに逆シリアル化できません

  21. 21

    オブジェクトのリストを別のコレクションタイプに逆シリアル化します

  22. 22

    カスタムファイルタイプのバイトストリームを.NetCoreのPOCOオブジェクトに逆シリアル化します

  23. 23

    JQueryを使用してカスタムオブジェクトの配列をシリアル化および逆シリアル化します

  24. 24

    AndroidプロジェクトのローカルストレージにProtoオブジェクトをシリアル化/逆シリアル化するにはどうすればよいですか?

  25. 25

    ジュリア:単純な動的システムのシミュレーションを最適化する

  26. 26

    ターミナルシミュレーションによるシェルスクリプトテスト

  27. 27

    統一されたカスタムオブジェクトのリストのシリアル化

  28. 28

    (WebApi)オブジェクトのコレクションをJsonにシリアル化できません

  29. 29

    KafkaコンシューマーからのJavaオブジェクトの逆シリアル化

ホットタグ

アーカイブ