|
詳細については、以下をご覧ください。 51CTOとHuaweiが共同で構築したHarmonyOSテクノロジーコミュニティ。 https://harmonyos..com 序文Androidプラットフォームをベースとしたシリアル化およびデシリアル化カプセル化コンポーネントであるParceler(https://github.com/johncarl81/parceler)が、HarmonyOS向けに実装およびリファクタリングされました。コードはオープンソース化(https://gitee.com/isrc_ohos/parceler_ohos)されており、既に多くのスターやフォークを獲得しています。皆様のダウンロード、ご利用、そして貴重なフィードバックをお待ちしております。 背景シリアライゼーションとは、Javaオブジェクトをバイト列に変換するプロセスを指します。基本的には、エンティティオブジェクトの状態を特定の形式に従って順序付けられたバイトストリームに書き込むことです。一方、デシリアライゼーションとは、バイト列をJavaオブジェクトに戻すプロセスを指します。基本的には、順序付けられたバイトストリームからオブジェクトを再構築し、その状態を復元することです。2つのJavaプロセスが相互に通信する場合、プロセス間オブジェクト転送を実現するために、Javaのシリアライゼーションおよびデシリアライゼーションメソッドが必要です。HarmonyOSのParceler_ohosコンポーネントは、異なるタイプのデータをカプセル化およびシリアライズすることで、プロセス間オブジェクト転送の効果を実現します。 コンポーネント効果表示Parceler_ohosコンポーネントは、基本データクラス、配列、マップ、セット、シリアル化可能なデータクラスなど、様々なデータ型のシリアル化とデシリアル化をサポートします。各データ型に含まれる具体的なデータクラスは以下のとおりです。
このコンポーネントは、int、float、String、plainArray、Sequenceable の 5 つのデータ型を例として使用して、シリアル化と逆シリアル化を示します。 コンポーネントアイコンをクリックすると、「Parceler Test」メインインターフェースが表示されます。このインターフェースには、「int Test」、「float Test」、「String Test」、「plainArray Test」、「Sequenceable Test」の5つのボタンがあります。これらのボタンをクリックすると、対応するデータ型のシリアル化およびデシリアル化テストインターフェースが表示されます。これらの5つのデータ型のテスト手順は同じであるため、以下のデモでは、コンポーネント内のintデータのテスト結果を例として使用します。 「intテスト」ボタンをクリックして「int形式テスト」インターフェースに入ります。「テスト開始」ボタンをクリックして、事前に設定された整数テストデータ「34258235」をシリアル化されたバイトストリームに変換し、「シリアル化:」というテキストの下にシリアル化結果を表示します。その後、バイトストリームをデシリアル化し、シリアル化前のオブジェクト「34258235」として出力します。「戻る」ボタンをクリックしてメインインターフェースに戻ります。テスト結果は図1に示されています。 図1. intデータのシリアル化とデシリアル化のテスト サンプル分析サンプルプロジェクトのMainMenuファイルは、コンポーネントアプリケーションのメインインターフェースを構築するために使用されます。その他のファイルは、コンポーネントの効果を示すために使用する5種類のデータに対するシリアル化およびデシリアル化のテストインターフェースを構築するために使用されます。これらの対応関係は図2に示されています。テスト手順は様々なデータ型で同じであるため、以下ではintデータのシリアル化およびデシリアル化テストを例に挙げて詳しく説明します。他のデータ型についてはこれ以上説明しません。 図 2 は、サンプル内のファイルとテスト インターフェイスのボタンの対応を示しています。 メインメニューファイルメインインターフェースのレイアウトは比較的シンプルで、主に5つの異なるデータテストインターフェースにアクセスするためのボタンで構成されています。具体的な手順は以下のとおりです。
1. 5 種類のデータのテスト ボタンとタイトルを宣言します。 「Parceler Test」というタイトルを表示するテキスト フィールドと、特定のテスト インターフェイスに移動するための 5 つのボタンを宣言し、タイプ別に名前を付けます。
2. ページレイアウトを作成する 幅と高さが親コントロールに合わせて調整され、上、下、左、右の方向にそれぞれ 10/32/10/80 のパディング間隔で垂直に配置されたページ レイアウトを作成し、背景色を白に設定します。
3. int データ テスト ボタンのリスナーを設定します。 「int data test」ボタンにonClick()イベントリスナーを設定し、ボタンをクリックすると「int data test」インターフェースにリダイレクトされるようにします。具体的なコードは以下のとおりです。
4. intデータテストボタンを作成する サンプル内の5つのテストボタンは、表示されるテキストとボタンリスナーイベントを除き、すべての点で同一です。これらの属性には、ボタンの色、ベベル、表示されるテキストサイズ、配置、パディング距離が含まれます。
IntTestファイル上記でメインインターフェースのレイアウトを紹介しました。次に、intデータのシリアル化とデシリアル化を例に、Parceler_ohosコンポーネントの使い方を説明します。このコンポーネントは、intデータを以下の4つのステップで処理します。
1. 関連するクラスをインポートするIntTestファイルでは、importキーワードを使用してParcelsクラスがインポートされています。このクラスは、データのシリアル化とデシリアル化のための特定のメソッドを提供します。
2.レイアウトを作成する整数データを表示するための縦向きのテストページレイアウトを作成します。幅と高さは親コントロールに合わせて調整します。上、下、左、右のパディングはそれぞれ32/32/80/80にします。背景色は白に設定します。
3. 入力データと出力データを設定するまず、入力データとして整数を設定します。テストデータ値 34258235 を整数オブジェクト `intIn` に割り当て、`setText()` メソッドを使用して、インターフェイス上に「Input: 34258235」という形式でテキストとして表示します。次に、2つの `Text` オブジェクトをインスタンス化します。1つは入力データのシリアル化された出力を「Serialization: xxx」という形式で表示するための `wrappedOutput` オブジェクト、もう1つはシリアル化結果のデシリアル化された出力を「Output: xxx」という形式で表示するための `output` オブジェクトです。
4. テストボタンを作成するシリアル化とデシリアライズ処理をトリガーするインターフェース上のボタンは「テスト開始」ボタンです。このボタンをクリックすると、wrap()メソッドが呼び出され、入力データに対してシリアル化処理が実行され、結果のバイトストリーム情報が、上記の手順3で実装した「Serialization:」テキストの後に表示されます。unwrap()メソッドが呼び出され、シリアル化されたバイトストリームに対するデシリアライズ処理が完了し、結果の整数オブジェクトが、上記の手順3で実装した「Output:」テキストの後に出力されます。
ライブラリ分析Parceler_ohosコンポーネントは、様々なタイプのデータに対してシリアル化およびデシリアライズ処理を実行できます。Parceler_ohosを使用してシリアル化およびデシリアライズ処理を実装するには、Pacelsクラスのwrap()メソッドとunwrap()メソッドを呼び出し、処理対象のデータを唯一のパラメータとして渡すだけです。具体的な使用方法は上記のサンプル分析で詳しく説明しているため、ここでは繰り返しません。以下のセクションでは、Parceler_ohosコンポーネントのシリアル化およびデシリアライズ処理の原理と、コンバータの原理について説明します。 1. シリアル化とデシリアル化の方法の原理の分析(1) wrap()メソッドはシリアル化を実装する シリアル化操作の原理と関数呼び出しの関係は、以下の図 3 に示されています。 図3.シリアル化動作原理の模式図 Parcels クラスでは、メソッドオーバーロードによって 2 つの wrap() メソッドが実装されています。最初の wrap() メソッドは開発者が直接呼び出すメソッドで、入力データを 1 つだけパラメータとして受け取ります。入力データが空でないことを確認した後、入力データの特定のデータ型を取得し、2 番目の wrap() メソッドを呼び出します。
2番目の`wrap()`メソッドは、入力データ型とデータ自体の2つの引数を取ります。入力データが空でないと判断されると、入力データ型`inputType`を`ParcelCodeRepository`クラスの`get()`メソッドの引数として渡し、`Parcelable`ファクトリオブジェクト`parcelableFactory`を返します。次に、`parcelableFactory`を介して`buildParcelable()`メソッドを呼び出し、実際のシリアル化操作を実行します。
`parcelableFactory.buildParcelable(input)` メソッドの具体的な実行プロセスは次のとおりです。 a. ジェネリッククラスインターフェースを実装する ParcelableFactory ジェネリック クラス インターフェイスを実装し、入力データを引数として buildParcelable(input) メソッドに渡します。
b. パラメータ型が入力データ型と一致する `buildParcelable(input)` メソッドを呼び出します。 LibraのNonParcelRepositoryクラスでは、複数のクラスがParcelableFactoryインターフェースを実装しており、その結果、buildParcelable(input)メソッドのパラメータ形式は、boolean、char、List、Integer、setといった様々な入力データ型に対応しています。入力データがint型の場合、パラメータ型Integerを指定したbuildParcelable(input)メソッドを呼び出して、新たにインスタンス化されたIntegerParcelableオブジェクトを返す必要があります。
c. IntegerParcelableクラスのオブジェクトをインスタンス化する コンバータクラスオブジェクトCONVERTERをインスタンス化し、IntegerParcelableクラスのコンストラクタを介してインスタンス化操作を完了します。このステップでは、入力データとコンバータCONVERTERを入力パラメータとして、IntegerParcelableの親クラスのコンストラクタを呼び出す必要があります。
d. 親クラスのコンストラクターを呼び出して、コンバータークラスのインターフェイスを実装します。 親クラスConverterParcelableのコンストラクタが呼び出されると、まず対応するコンバータクラスにTypeRangeParcelConverterクラスインターフェースのtoParcel()メソッドとfromParcel()メソッドが実装されます。次に、対応するコンバータクラスのtoParcel()メソッドが呼び出され、シリアル化操作が完了します。コンバータクラスの具体的な実装原理については後ほど詳しく説明するため、ここでは繰り返しません。
(2) unwrap()メソッドはデシリアライゼーションを実装します。 デシリアライズを実装するには、入力データが空でないことを確認した後、入力データの値を ParcelWrapper インターフェースの汎用クラス オブジェクトに割り当て、クラス オブジェクトを通じて getParcel() メソッドを呼び出して、入力データのデシリアライズ結果を取得します。
wrapper.getParcel() メソッドの具体的な実行プロセスは次のとおりです: ParcelWrapper ジェネリック クラス インターフェイスを実装し、getParcel() メソッドを実装して具体的な逆シリアル化操作を実行し、最後に逆シリアル化された "@Parcel" インスタンスを返します。
2. コンバータ処理原理前述の`wrap()`シリアル化メソッドの説明で述べたように、`Parceler_ohos`コンポーネントのコンバーター処理クラスは`Converter`クラスです。これらのクラスは、nullチェックやデータ収集の反復処理など、データ収集に関連する複雑で冗長なさまざまなタスクの処理を担い、対応するAPIパッケージ内でデータ収集変換に簡単にアクセスできるように、`converter`という名前のパッケージにパッケージ化されています。これらのコンバーター処理クラスは、基本データ型、Map型、Set型など、さまざまなデータ型を変換できます。具体的な変換原理はほぼ同じです。以下では、文字列配列コンバーターである`CharArrayParcelConverter`クラスを例に説明します。 CharArrayParcelConverter クラスには、toParcel() と fromParcel() という2つのメインメソッドが含まれており、これらはそれぞれ Parcel オブジェクトへの書き込みと読み取り操作を担います。toParcel() メソッドでは、まず文字列データが空かどうかを確認します。空の場合、配列データが Parcel オブジェクトに書き込まれ、書き込まれるデータは NULL です。空でない場合、書き込まれるデータは長さとデータ自体を含む文字列配列です。
fromParcel() メソッドでは、まず Parcel オブジェクトから配列の長さが読み取られます。長さが空の場合は空の値、そうでない場合は新しい文字列配列がインスタンス化されます。Parcel オブジェクトを介して readCharArray() メソッドが呼び出され、新しくインスタンス化された配列を入力パラメータとして配列からデータが読み取られます。これにより、読み取られたデータは新しくインスタンス化された配列に格納され、後で簡単に使用および処理できるようになります。その後、新しい配列が返され、読み取りプロセスが完了します。
詳細については、以下をご覧ください。 51CTOとHuaweiが共同で構築したHarmonyOSテクノロジーコミュニティ。 https://harmonyos..com |
HarmonyOSオープンソースのサードパーティコンポーネント - Parceler_ohos、シリアル化およびデシリアル化カプセル化コンポーネント
関連するおすすめ記事
-
このオープンソース ツールを使用して、データを上司にとってより使いやすいものにします。
-
SoCC 論文解説: ByteDance が大規模クラスタで統合リソース スケジューリングを実行する方法
-
100 倍の高速化を実現!Google が強力なテンソル コンピューティング ライブラリ TensorNetwork をオープンソース化しました。
-
ここでは、学習する価値のある、推奨されるオープンソース プロジェクトとフレームワークをいくつか紹介します。
-
DeepSeek が FlashMLA をオープンソース化しましたが、これはいったい何なのでしょうか? (やっと分かりました...)
-
Docker コンポーネントを使用して Django プロジェクトを開発するにはどうすればよいですか?