読者の皆さん、Habrahabrこんにちは!
この投稿は、別の投稿とそこから尊敬されているAnatolyB habrayuzerのコメントに触発されています。
多くの人がこのライブラリに精通していると思いますが、それにもかかわらず、Habraのページにはまだ反映されていないことが判明しました。 今日、この誤解に対処します。
そして、もちろん、私はこの美しいライブラリに慣れていない人にできるだけ早くお勧めします、私はこれであなたを助けようとします。
イントロ
Simple Frameworkは、XMLでJavaオブジェクトをシリアライズ/デシリアライズするためのAndroid仮想マシン互換ライブラリです。
Simpleの主な利点は、コンテンツとXML表現を使用してクラス間の関係を記述する宣言的アプローチです。 つまり クラスのフィールドに適切な属性を設定するだけで、すぐにXMLでシリアル化できます。必要に応じて、またはその逆も可能です。 ノードの一覧表示など、追加のガベージを行う必要はありません。すべてが非常にシンプルで透過的です。 クラスフィールドの比較、リスト、値の取得などのすべての作業 シンプルになり、この反射で彼女を助けます。
公式サイトには、ライブラリでの作業を開始するために必要なものがすべて揃っているほか、私のお気に入りの種類のドキュメント:汎用性の高いサンプルが多数含まれているドキュメントがあります。
まず、 ここからライブラリをダウンロードします 。 jarファイルを見つけて、プロジェクト内のlibフォルダーにコピーします。 次に、「Add JARs ...」を使用してjarをビルドパスに追加し、最終的に次のようなものを取得します。
使用例
これで、プロジェクトでSimpleを使用できます。 そして、私たちが最初にやろうとすることは、単純なXMLをJavaクラスに変換することです。
次のXMLがあるとします。
<Pet> <Name>Bobby</Name> <Age>8</Age> <NickName>Lucky</NickName> </Pet>
これは、「pet」の本質を表しており、必須フィールド:名前と年齢、およびオプションのニックネームが1つあります。
このXMLをいくつかのクラスに関連付けるには、クラスを作成して特別な属性を追加する必要があります。これにより、Simpleが何をどのように実行したいかを理解できます。 この例では、クラスは次のようになります。
@Root(name="Pet") public class MyPet { @Element(name="Name") public String name; @Element(name="Age") public int age; @Element(required=false, name="NickName") public String nickName; }
どこで:
- ルート -ルートXML要素を指します。
- 要素 -ペット内部フィールド。
- required-このフィールドはオプションかもしれません。
- name-入力XMLの要素の名前を示します。この名前とクラスのフィールドが一致する場合、この属性は省略できます。
<Pet Name="Bobby" Age="8" NickName="Lucky"/>
そして、クラスは次のようになります。
@Root(name="Pet") public class MyPet { @Attribute(name="Name") public String name; @Attribute(name="Age") public int age; @Attribute(required=false, name="NickName") public String nickName; }
逆シリアル化コード自体は次のようになります。
Reader reader = new StringReader(xml); Persister serializer = new Persister(); try { MyPet pet = serializer.read(MyPet.class, reader, false); Log.v("SimpleTest", "Pet Name" + pet.name); } catch (Exception e) { Log.e("SimpleTest", e.getMessage()); }
上記のコードでは、2つのパラメーターをSimpleシリアライザー入力に渡しました。MyPet.class-デシリアライゼーションの属性の説明を含むクラスへのポインターとreader-入力XMLを含むストリーム。 ご覧のとおり、コードはまったく複雑ではなく、非常にコンパクトです。
逆変換のコードも非常に簡単です。
Writer writer = new StringWriter(); Serializer serializer = new Persister(); try { MyPet pet = new MyPet(); pet.name = "Bobby"; pet.age = 8; pet.nickName = "Lucky"; serializer.write(pet, writer); String xml = writer.toString(); } catch (Exception e) { Log.e("SimpleTest", e.getMessage()); }
カプセル化の原則に準拠するために、クラスのフィールドをget'ersとset'ersでラップすることができ、Simpleはそれらで動作します:
@Root(name="Pet") public class MyPet { private String name; private int age; private String nickName; @Attribute(name="Name") public void setName(String name) { this.name = name; } @Attribute(name="Name") public String getName() { return name; } @Attribute(name="Age") public void setAge(int age) { this.age = age; } @Attribute(name="Age") public int getAge() { return age; } @Attribute(required=false, name="NickName") public void setNickName(String nickName) { this.nickName = nickName; } @Attribute(required=false, name="NickName") public String getNickName() { return nickName; } }
XML要素に独自の属性またはネストされた要素がある場合、別のクラスまたはそれらのリストとして宣言できます。 サンプルを変更し、エンティティ「nursery」を追加します。これには、任意の数のオブジェクト「pet」(ペット)を含めることができます。 例:
<Nursery> <Pet Name="Bobby" Age="8" NickName="Lucky"/> <Pet Name="Rex" Age="3"/> <Pet Name="Pumba" Age="1"/> </Nursery>
この例で必要なことは、「保育園」のクラスを追加することだけです。
@Root(name="Nursery") public class MyNursery { @ElementList(inline=true, name="Pet") public List<MyPet> pets; }
ご覧のとおり、すべてが同じくらい簡単です。 inlineキーワードは、中間の親要素を使用せずに、「ペット」要素がMyNurseryのすぐ内側に含まれることを示します。
Nurseryをダウンロードするためのコードは、Petで行ったことと似ています。
Reader reader = new StringReader(xml); Persister serializer = new Persister(); try { MyNursery nursery = serializer.read(MyNursery.class, reader, false); Log.v("SimpleTest", "Pets in nursery: " + nursery.pets.size()); } catch (Exception e) { Log.e("SimpleTest", e.getMessage()); }
これらの例は、Simpleライブラリで独立した調査を始めるのに十分だと思います。 さらに、多数の例が公式Webサイトに掲載されています。
おわりに
Simpleは、おそらくXMLでのみ可能なすべての構成のためのソリューションを提供します。 継承やインターフェースなどのJava機能もサポートされています。
Simpleを使用する場合、次のプラス面とマイナス面に注意することができます。
ポジティブ:
- 使いやすく、理解しやすい。
- このアプローチでのコードの量は最小限です。
- Androidプラットフォームのサポート。
- さまざまなXMLコンストラクトの豊富なサポート。
- Android以外のアプリケーション、たとえば、デバイスから結び付けられていない単体テストに適用する機能。
- Apacheライセンス、つまり 商用ソフトウェアで自由に使用できます。
マイナス:
- 単純な属性構文はクラス表現をオーバーロードします。
- Simpleの操作には、リフレクションメカニズムが使用されますが、これらはコストのかかる操作です。 したがって、パフォーマンスを要求する製品でこのフレームワークを使用する場合、そのようなソリューションの実現可能性を検討する価値があります。