Androidの直列化データ伝送及び高度の高レベルアーキテクチャ

その他のAndroidのビデオの高度なアーキテクチャ高度な学習クリック:https://space.bilibili.com/474380680
この記事を次の要素からのデータ送信のシーケンスを説明するために:

  • [Serializableを原則]
  • [Parcelable原理と使用方法]
  • [JSON]

、Serializableを原則

  • 1.コンセプト
    • シリアル化:Javaオブジェクトをバイト列に変換する処理。
    • 非直列化:Javaオブジェクトのバイトシーケンスのための回復プロセス。
  • 2. 2つの主な目的を持つオブジェクトの配列の使用:
    • 1)通常のファイルに保存されている恒久的にハードディスクに保存されたターゲットバイトシーケンスを、。
    • ネットワーク上で送信されたバイトの2)標的配列。

  • いわゆるシリアル化は、Javaストアド及び読み取りインタフェースが提供する汎用データです。どこかから読み出されて、関数の引数の後ろに隠れているところなセーブ。この方法では、そう長く実装Serializableインタフェースのいずれかのタイプとして、それがファイルに保存、または別の場所にネットワーク経由でデータストリームとして送信することができます。パイプは、システム内の他のプログラムに送信することができます。このように大幅にクラスの設計を簡素化します。限り設計上の特徴として、右のすべての問題を解決する上で読書を保存することができます。
  • Javaの「オブジェクト直列化は、」アウトバイトこのオブジェクトを使用するには、将来的には、あなたがデータを復元することができますように、バイトの集合に変換Serializableインタフェースを実現するために、あなたのターゲットにすると、再構築のに応じて対象ます。
  • いくつかのデータの中のプロセス変数の型ワークフロー:文字列、整数、短い、長い間、あなたはプロセス変数にオブジェクトを設定するので、あなたは、シリアル化のためのJavaBean理由を達成したい理由ですダブル、ブール、日付、バイナリ、直列化可能、私たちは、それ以外の場合は、セットアッププロセス変数の回にエラーの種類を見つけることができません、シリアル化を実装する必要があります。
  • 機構は、JavaにあるJavaオブジェクトのシリアル化は、メモリ内のオブジェクト(JavaBeanのユーザーなど)バイナリストリームに変換します。Javaオブジェクトのシリアル化の後に容易に保存することができ、またはネットワークに送信されます。
  • Javaのシリアル化メカニズムは、クラスを決定するシーケンスID(serialVersionUIDの)の一貫性の実行時のバージョンによって決定されます。
  • デシリアライズする際、バイナリストリームを介してJava仮想マシンは、適切な情報を取得する、または矛盾シリアライズバージョンをスロー逆シリアル化することができ、同様に同じであるとみなされる場合、ローカルエンティティクラスは、比較を対応serialVersionUIDの例外。
  • 所以涉及到数据传输或者存储的类,严格意义上来说都要加上序列化ID,这也是一种良好的编程习惯

二、Parcelableの原則および使用方法

Parcelableの2.1 Androidのソースコード

/**
     * Interface for classes whose instances can be written to
   * and restored from a {@link Parcel}.  Classes implementing the Parcelable
 * interface must also have a non-null static field called <code>CREATOR</code>
 * of a type that implements the {@link Parcelable.Creator} interface.
 * 
 * <p>A typical implementation of Parcelable is:</p>
 * 
 * <pre>
 * public class MyParcelable implements Parcelable {
 *     private int mData;
 *
 *       public int describeContents() {
 *         return 0;
 *     }
 *
 *     public void writeToParcel(Parcel out, int flags) {
 *         out.writeInt(mData);
 *     }
 *
 *     public static final Parcelable.Creator<MyParcelable> CREATOR
 *             = new Parcelable.Creator<MyParcelable>() {
 *         public MyParcelable createFromParcel(Parcel in) {
 *             return new MyParcelable(in);
 *         }
 *
 *         public MyParcelable[] newArray(int size) {
 *             return new MyParcelable[size];
 *         }
 *     };
 *     
 *     private MyParcelable(Parcel in) {
 *         mData = in.readInt();
 *     }
 * }</pre>
 */

ソースコードは、導入することにより知ることができる、我々は、最大書くので、Parcelableインタフェースの実装クラスは、小包によって書かれたデータを回復し、空でない静的変数CREATORがなければならない、と例を挙げたされ、比較的簡単ですしかし、簡単な使用は、それがAndroidのParcelableでソースコードを表示して確認することができ、私たちの究極の目標ではない、Parcelable実装プロセスをシリアライズ、デシリアライゼーションの分割され、三つのプロセスを説明し、以下では、これら三つのプロセスの下で導入されました。

2.2小包について

導入前に、我々は、小包は?小包が平均パッケージ化されている翻訳された、実際には、我々は全体の転送データに使用されるプロセスであるバインダー、中のデータ伝送、および送信をパッケージ化する必要があるかを理解する必要があります

パーセル機構を提供し、データは共有メモリのシーケンスの後に書くことができる簡単に説明すると、他のプロセスは、共有メモリを介してパーセルバイトのこのストリームから読み出され、そしてオブジェクトにデシリアライズすることができ、図は、このプロセスのモデルです。

 
4118241-89f05cac0ce4cc1e.png
 

パーセルは(等のwriteInt()、のwriteFloat()、のような種々の方法を書き込むために対応)プリミティブデータ型を含んでいてもよい、Parcelableオブジェクトを含んでもよく、それはまた、アクティブオブジェクトIBinderの参照が含まれ、この基準は、受信のもう一方の端を引き起こしますのプロキシIBinder IBinderを指します。
小包Parcelableは直列化および非直列化を達成するために、読み取りと書き込みの方法によって達成しました

2.3 Parcelable 3(シリアライゼーション、デシリアライゼーション、説明)に記載された手順

シリアライズされた何2.3.1

シリアライズ、状態が保存又は送信されても​​よい表すオブジェクトに変換します。直列化されたオブジェクトがネットワーク上で送信することができる、それがローカルに格納されてもよいです。

ここでは、基本的に関係を整理するだけでなく、シンプルで概略図を理解し、Parcelableを実装する前に、次のステップ、次の導入Parcelable 3つの主要なプロセスを実現するためにする必要があります。
[アップロードイメージ...(image.png-73288d- 1522235519935から0)]

I最初のコードステッカー

public class Album implements Parcelable {

    /**
     * 负责反序列化
     */
    private static final Creator<Album> CREATOR = new Creator<Album>() {
        /**
         * 从序列化对象中,获取原始的对象
         * @param source
         * @return
         */
        @Override
        public Album createFromParcel(Parcel source) {
            return new Album(source);
        }

        /**
         * 创建指定长度的原始对象数组
         * @param size
         * @return
         */
        @Override
        public Album[] newArray(int size) {
            return new Album[0];
        }
    };

    private final String mId;
    private final String mCoverPath;
    private final String mDisplayName;
    private final long mCount;

    Album(String id, String coverPath, String displayName, long count) {
        mId = id;
        mCoverPath = coverPath;
        mDisplayName = displayName;
        mCount = count;
    }

    Album(Parcel source) {
        mId = source.readString();
        mCoverPath = source.readString();
        mDisplayName = source.readString();
        mCount = source.readLong();
    }

    /**
     * 描述
     * 返回的是内容的描述信息
     * 只针对一些特殊的需要描述信息的对象,需要返回1,其他情况返回0就可以
     *
     * @return
     */
    @Override
    public int describeContents() {
        return 0;
    }

    /**
     * 序列化
     *
     * @param dest
     * @param flags
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(mId);
        dest.writeString(mCoverPath);
        dest.writeString(mDisplayName);
        dest.writeLong(mCount);
    }

2.3.2 Parcelable役割を達成

1)永久的オブジェクト、オブジェクトがローカルファイルに格納されたバイトのシーケンスです。

2)オブジェクト・ネットワーク内の直列化されたオブジェクトを渡すことによって、

3)プロセスのシリアル化の間にオブジェクトを渡します。

実装インタフェースは、2つのメソッドを実装するために私たちを可能にするというクラスを記述するために最初Parcelable:

  • describeContentsの説明
    ファイルの説明を担当しdescribeContents。それは、ソースコードの記述から分かるように、オブジェクト情報にのみいくつかの特別なニーズのために説明され、1を返す必要が、それ以外の場合に0を返します

  • writeToParcelシーケンス
    我々は直接小包のwriteメソッドを呼び出すことができますので、この方法は、基本的な書き込みがあり、writeToParcel小包が返され、writeToParcelによって直列化を実装するために私たちの方法で、基本データ型、他のブールに加えて、以下に別々に特別なオブジェクトとコレクションを話します持っている、ブールはintまたはバイトのストレージを使用することができます

私たちは、アルバムオブジェクトは4つのフィールドが含まれ、アルバム連載上記目的を達成します。

2.3.4直列化復元

上記、変数CREATORを定義するためのデシリアライズの必要性はまた、あなたは、Androidの例に直接コピーすることができ、特定の慣行が、あなたも自分のAを(名前は変更してはなりません)を定義することができ、Parcelableは匿名の内部クラスによって達成言いましたクリエーターインターフェース

2.4 Parcelableの使用と実装

三つのプロセス上記の紹介によると、それが終わっParcelableは、あなたがしようとするデータ伝送、別のputExtra getParcelableExtraで独自の2つのアクティビティを書くことができ、インテントに直接転送することができます。

2.5 Parcelableオブジェクトとコレクションの処理

import android.os.Parcel;
import android.os.Parcelable;

import java.util.ArrayList;

/**
 * Created by fengxing on 2018/3/28.
 */

public class ParcelDemo implements Parcelable {

    private int count;
    private String name;
    private ArrayList<String> tags;
    private Book book;
    // ***** 注意: 这里如果是集合 ,一定要初始化 *****
    private ArrayList<Book> books = new ArrayList<>();

    /**
     * 序列化
     *
     * @param in
     */
    protected ParcelDemo(Parcel in) {
        count = in.readInt();
        name = in.readString();
        tags = in.createStringArrayList();

        // 读取对象需要提供一个类加载器去读取,因为写入的时候写入了类的相关信息
        book = in.readParcelable(Book.class.getClassLoader());

        //读取集合也分为两类,对应写入的两类

        //这一类需要用相应的类加载器去获取
        in.readList(books, Book.class.getClassLoader());// 对应writeList

        //这一类需要使用类的CREATOR去获取
        in.readTypedList(books, Book.CREATOR); //对应writeTypeList

        //books = in.createTypedArrayList(Book.CREATOR); //对应writeTypeList

        //这里获取类加载器主要有几种方式
        getClass().getClassLoader();
        Thread.currentThread().getContextClassLoader();
        Book.class.getClassLoader();

    }

    public static final Creator<ParcelDemo> CREATOR = new Creator<ParcelDemo>() {
        @Override
        public ParcelDemo createFromParcel(Parcel in) {
            return new ParcelDemo(in);
        }

        @Override
        public ParcelDemo[] newArray(int size) {
            return new ParcelDemo[size];
        }
    };

    /**
     * 描述
     *
     * @return
     */
    @Override
    public int describeContents() {
        return 0;
    }

    /**
     * 反序列化
     *
     * @param dest
     * @param flags
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(count);
        dest.writeString(name);
        //序列化一个String的集合
        dest.writeStringList(tags);
        // 序列化对象的时候传入要序列化的对象和一个flag,
        // 这里的flag几乎都是0,除非标识当前对象需要作为返回值返回,不能立即释放资源
        dest.writeParcelable(book, 0);

        // 序列化一个对象的集合有两种方式,以下两种方式都可以

        //这些方法们把类的信息和数据都写入Parcel,以使将来能使用合适的类装载器重新构造类的实例.所以效率不高
        dest.writeList(books);

        //这些方法不会写入类的信息,取而代之的是:读取时必须能知道数据属于哪个类并传入正确的Parcelable.Creator来创建对象
        // 而不是直接构造新对象。(更加高效的读写单个Parcelable对象的方法是:
        // 直接调用Parcelable.writeToParcel()和Parcelable.Creator.createFromParcel())
        dest.writeTypedList(books);

    }
}

Bookクラスは、あなたが実装手順ははみ出さず、通常のオブジェクトは、三つのプロセスを達成するために、Parcelableを実現する必要があります

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Created by fengxing on 2018/3/28.
 */

public class Book implements Parcelable {

    protected Book(Parcel in) {
    }

    public static final Creator<Book> CREATOR = new Creator<Book>() {
        @Override
        public Book createFromParcel(Parcel in) {
            return new Book(in);
        }

        @Override
        public Book[] newArray(int size) {
            return new Book[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
    }
}

書き込み、2つの方法があり、読書のコレクションは、
1のクラスローダを通読し、その後クラスに関連する情報であり、かつ、 - > writeList | readListは、
第二あなたがCREATORを作成するときに、着信クラスに関連するクラス関連の情報ではありません作成する- > writeTypeList | readTypeList | createTypedArrayList
いくつかの第二の高効率化
- >定義のセットがある場合は、時間に必須の注意を払うが、このように初期化する必要があります
public ArrayList<T> demo = new ArrayList<>();

そして、2.6 ParcelableとSerializableのの違いを比較

Parcelableと実装シリアライズがシリアライズされ、テントの間でデータを転送するために使用することができる、直列化はJava実装月頻繁IOオペレーション、消費が比較的大きいが、簡単な方法は、Android Parcelableが提供方法であるので、より効率的です、シーケンスメモリParcelableを選択し、ストレージデバイスやネットワーク伝送シリアライズを選択する(もちろんもやや複雑Parcelableことで)高いが、より実装するために複雑な、両方の選択ルールであります

2.6.1選択シリアライズ方法原理

高い直列化性能よりメモリ、Parcelableを使用する場合は1)、Parcelableを使用することが推奨されます。

2)時間の順序で直列化頻繁にGCを起こし、一時変数の多くを生成します。

3)ParcelableはあなたがよくParcelableとして、ディスク上に格納されたデータは外の世界での状況の変更時のデータの連続性を保証することはできませんしたい場合に使用することはできません。Serializableを低効率、今回が、Serializableを使用することをお勧めします。

三JSON

3.1 JSON

データ伝送フォーマット、および言語に依存しない、軽量の開発。
JavaScriptなど始まったが、比較的普及の背後にある、ほぼすべての言語には、適切な使用のAPIを持っています。

3.2データ構造

オブジェクトは---オブジェクト
  のコンフィギュレーションに含まれる鍵{}括弧を使用して
  キーは、実質的に任意のタイプまたはデータ構造(オブジェクトまたは配列)の文字列値でなければなりません

---配列array
  要素を分離するために開始するには、コンマによって、角括弧を使用して[]

基本型:
   文字列番号偽ヌルに忠実に
例:

{
  "name" :"王小二",
  "age": 22,
  "birthday" : "1990-12-1", 注意:json里没有Date这种时间的类型,所以用string;需要了解一下时间戳
  "school" : "蓝翔",
  "major": ["理发","挖掘机"],
  "has_girlfriend":false,
  "car": null,
  "house": null,
  "commont": "这是一个注释"
}
注意:
json中没有注释的写法,但是我们可以曲线救国
{
    "id":"1",
    "author":{
        "id":"1506200043",
        "name":"kylin",
        "gender":1
    },
    "major":["理发","挖掘机"]
}

場合は、次のパッケージを導入するのに使用する必要のあるJavaは、JSONのサポートを持っています:

コモンズ-beanutils.xxx.jar
    コモンズ-collections.xxx.jar
    コモンズ-lang.xxx.jar
    コモンズ-logging.jar
    JSON-lib.xxx.jar
    ezmorph.xxx.jar

コモンモードJSON文字列を生成する:----------前端に後端からデータが
1 PUT使用するキーと値のマップデータは、オブジェクトのJSON形式に変換される- JSON文字列をに変換---その後、フロントエンドに送られます

//map(javaObject)--->jsonObject---->jsonStr ----前端
import net.sf.json.JSONObject;
public void jsonStrByMap(){

//构建map对象,并且把需要发送给前端的东西添加进入
Map<String,String> params=new HashMap<>();
params.put("status","200");
params.put("username","kylin");
params.put("password","123456");
params.put("sexy","male");
params.put("userID","15062");

//java对象变成json对象
JSONObject jsonObject=JSONObject.fromObject(params);

//json对象转换成json字符串
String jsonStr=jsonObject.toString();

System.out.println(jsonStr);
}

2.ビルドJSONへのJavaBean

User.java
public class User {
  private String username;
  private String password;


public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

}
//javabean---json对象---json字符串---->前端
public void jsonStrByJavaBean(){

//创建一个User对象
User user=new User();
user.setUsername("kylin");
user.setPassword("123456");

//java对象转换成json对象
JSONObject jsonObject=JSONObject.fromObject(user);

//json对象转换成json字符串
String jsonStr=jsonObject.toString();
System.out.println(jsonStr);
}

データは、遠位端から取得------>データの後端に変換することができる
JSONオブジェクトJava文字列に変換

//前端传递过来的是json字符串,那么我们对这个字符串需要进行获取并且处理
//json字符串-----json对象------java对象
JSONObject jsonobject = JSONObject.fromObject(jsonStr);
User user=(User)JSONObject.toBean(jsonobject,User.class);
//然后就通过user对象来操作了
String username=user.getUsername();
String password=user.getPassword();

マップオブジェクトにJSON文字列

JSONObject jsonobject = JSONObject.fromObject(jsonStr);
Map params=(Map) jsonObject;
//然后就可以通过map来操作了
//判断是否有username字段和username字段
if (params.containsKey("username")){
    System.out.println(params.get("username"));
}
if (params.containsKey("password")){
    System.out.println(params.get("password"));
}

詳しくはこちらAndroidのアーキテクチャ高度なビデオをクリックしてください:https://space.bilibili.com/474380680
参考:https://www.cnblogs.com/shan-kylin/p/9218680.html
HTTPS://www.cnblogs .COM / chenmingjun / P- / 9746310.html
https://www.jianshu.com/p/df35baa91541

おすすめ

転載: www.cnblogs.com/Android-Alvin/p/11948894.html
おすすめ