コンセプト
シリアル化:プロセスのバイトシーケンスにオブジェクトがシリアル伝送と呼ぶことができます。
デシリアライズ:還元プロセスがオブジェクトのデシリアライズと呼ばれるバイトのシーケンスです。
なぜ我々はシリアライズする必要がありますか
究極の目標は、オブジェクトがプラットフォーム、およびネットワーク伝送を横切って格納することができるシリアル化することです。そして、我々は、クロスプラットフォームのストレージとネットワークの伝送を行う方法がIO、IOのサポートがあると私たちのデータ形式は、バイト配列です。
私たちは一方的にのみバイト配列にオブジェクトが十分でないので何のルールのバイト配列が存在しないため、我々は戻って、オブジェクトの本当の色を復元する方法がありませんので、我々はときに彼バイト配列にオブジェクトを配置する必要があります内部に再びルール(シリアライズ)、その後、我々はIOストリームからデータを読み込むを開発する際に、このバックルール(直列化復元)における標的の減少。
私の家は車にレンガの数に分割され、我々は別の場所に1つの場所から運ば家をしたい場合は、シリアル化され、その後、家の元の構造の描画を残し、デシリアライズされます家の後、我々はプロセスにレンガの家の元の外観を復元するためにブロックの図面によると、目的地への輸送します
何の下では状況がシリアライズする必要があります
以上により、私はすでに、すべてのデータは、「クロスプラットフォームのストレージ」および「伝送ネットワーク」にする必要があるシリアル化する必要が知っていると思います。
基本的に貯蔵および輸送は、バイトのフォーマット認識クロスプラットフォームにオブジェクトの状態を保存するために、ネットワークを介して行かなければならないと他のプラットフォームでは、オブジェクト情報のバイト情報を減らすことによってのみ解決することができます。
シリアル化の方法
オブジェクトを組み立てるだけで解体シリアル化のルールは、このルールは確かにそのようになりまし共通のシリアル化方法として、様々なを持っていることがあります:
JDK(言語間でサポートされていない)、JSON、XML、ヘッセ、Kryo(クロスランゲージをサポートしていません)、スリフト、Protostuff、FSTは、(クロスランゲージをサポートしていません)
Javaシリアル
Javaは直列化を達成我々は唯一のSerializableインタフェースを実装する必要があり、非常に簡単です。
パブリッククラスユーザーはSerializable {実装 //年龄 プライベートint型の年齢を、 //名字 プライベート文字列名; 公共int型getAge(){ 戻り値の年齢。 } 公共ボイドsetAge(int型の年齢){ this.age =年齢。 } パブリック文字列のgetName(){ 戻り名。 } 公共ボイドのsetName(文字列名){ this.name =名。 } }
注:JAVAのシリアライズ共通の問題
- 質問:静的プロパティは、シリアライズすることはできません
理由:オブジェクトの状態のシーケンスが保存され、クラスに属する静的な状態変数なので、静的変数の順序は保存されません。
- 第二の問題:一時プロパティがシリアル化されません。
- 質問3:シリアル化されたバージョンのserialVersionUID
シリアル化を実装するすべてのオブジェクトは、バージョン番号を持っている必要があり、我々はJDKツールは、私たちの目的に応じてプロパティの対応するバージョン番号を生成し、定義されていない場合、バージョン番号は、自分で定義することができます。使用のserialVersionUID JDKは限り、オブジェクトが変更されますserialVersionUIDのと少し変わったように、生成されました。手動でバージョン番号を定義することをお勧めします。
Redisのシリアライズ
あなたはRedisのキーと値、Redisの用語の値を使用する場合には、バイト配列です。あなたはその上で、バイト配列にデータ構造を変換する担当に身を置い読み取り時に読み出されなければなりません。
文字列は、すでにほとんどのバイト配列を所有し、これに対処する必要はありませんですので、特別な場合は、文字列です。
233
参考記事
https://zhuanlan.zhihu.com/p/40462507
https://www.zhihu.com/question/277363840/answer/392945240