序列化Serializable和Parcelable的理解和區(qū)別

本文出自 “阿敏其人” 簡(jiǎn)書(shū)博客径玖,轉(zhuǎn)載或引用請(qǐng)注明出處梳星。

一、android為什么要序列化始绍?什么是序列化,怎么進(jìn)行序列化

why

為什么要了解序列化年堆?—— 進(jìn)行Android開(kāi)發(fā)的時(shí)候变丧,無(wú)法將對(duì)象的引用傳給Activities或者Fragments痒蓬,我們需要將這些對(duì)象放到一個(gè)Intent或者Bundle里面,然后再傳遞鲁捏。

what

什么是序列化 —— 序列化给梅,表示將一個(gè)對(duì)象轉(zhuǎn)換成可存儲(chǔ)或可傳輸?shù)臓顟B(tài)动羽。序列化后的對(duì)象可以在網(wǎng)絡(luò)上進(jìn)行傳輸渔期,也可以存儲(chǔ)到本地羽德。

how

怎么通過(guò)序列化傳輸對(duì)象宅静?

Android中Intent如果要傳遞類(lèi)對(duì)象姨夹,可以通過(guò)兩種方式實(shí)現(xiàn)磷账。

  • 方式一:Serializable吼鱼,要傳遞的類(lèi)實(shí)現(xiàn)Serializable接口傳遞對(duì)象菇肃,
  • 方式二:Parcelable琐谤,要傳遞的類(lèi)實(shí)現(xiàn)Parcelable接口傳遞對(duì)象。

Serializable(Java自帶):
Serializable是序列化的意思织阳,表示將一個(gè)對(duì)象轉(zhuǎn)換成可存儲(chǔ)或可傳輸?shù)臓顟B(tài)陈哑。序列化后的對(duì)象可以在網(wǎng)絡(luò)上進(jìn)行傳輸,也可以存儲(chǔ)到本地厘贼。

Parcelable(android 專用):
除了Serializable之外毁欣,使用Parcelable也可以實(shí)現(xiàn)相同的效果凭疮,
不過(guò)不同于將對(duì)象進(jìn)行序列化执解,Parcelable方式的實(shí)現(xiàn)原理是將一個(gè)完整的對(duì)象進(jìn)行分解衰腌,
而分解后的每一部分都是Intent所支持的數(shù)據(jù)類(lèi)型琼稻,這樣也就實(shí)現(xiàn)傳遞對(duì)象的功能了帕翻。

實(shí)現(xiàn)Parcelable的作用

1)永久性保存對(duì)象,保存對(duì)象的字節(jié)序列到本地文件中闹丐;

2)通過(guò)序列化對(duì)象在網(wǎng)絡(luò)中傳遞對(duì)象;

3)通過(guò)序列化在進(jìn)程間傳遞對(duì)象。

選擇序列化方法的原則

1)在使用內(nèi)存的時(shí)候粥鞋,Parcelable比Serializable性能高缘挽,所以推薦使用Parcelable。

2)Serializable在序列化的時(shí)候會(huì)產(chǎn)生大量的臨時(shí)變量呻粹,從而引起頻繁的GC壕曼。

3)Parcelable不能使用在要將數(shù)據(jù)存儲(chǔ)在磁盤(pán)上的情況,因?yàn)镻arcelable不能很好的保證數(shù)據(jù)的持續(xù)性在外界有變化的情況下等浊。盡管Serializable效率低點(diǎn)腮郊,但此時(shí)還是建議使用Serializable 。

應(yīng)用場(chǎng)景

需要在多個(gè)部件(Activity或Service)之間通過(guò)Intent傳遞一些數(shù)據(jù)筹燕,簡(jiǎn)單類(lèi)型(如:數(shù)字轧飞、字符串)的可以直接放入Intent制妄。復(fù)雜類(lèi)型必須實(shí)現(xiàn)Parcelable接口。

二、利用java自帶的Serializable 進(jìn)行序列化的例子

弄一個(gè)實(shí)體類(lèi) Person埃疫,利用Java自帶的Serializable進(jìn)行序列化

package com.amqr.serializabletest.entity;
import java.io.Serializable;
/**
 * User: LJM
 * Date&Time: 2016-02-22 & 14:16
 * Describe: Describe Text
 */
public class Person implements Serializable{
    private static final long serialVersionUID = 7382351359868556980L;
    private String name;
    private int age;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

使用销凑,MainActivity和SecondActivity結(jié)合使用

MainActivity

package com.amqr.serializabletest;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.amqr.serializabletest.entity.Person;
/**
 * 進(jìn)行Android開(kāi)發(fā)的時(shí)候呆馁,我們都知道不能將對(duì)象的引用傳給Activities或者Fragments屯吊,
 * 我們需要將這些對(duì)象放到一個(gè)Intent或者Bundle里面,然后再傳遞。
 *
 *
 * Android中Intent如果要傳遞類(lèi)對(duì)象律胀,可以通過(guò)兩種方式實(shí)現(xiàn)黑低。
 * 方式一:Serializable勋眯,要傳遞的類(lèi)實(shí)現(xiàn)Serializable接口傳遞對(duì)象,
 * 方式二:Parcelable这刷,要傳遞的類(lèi)實(shí)現(xiàn)Parcelable接口傳遞對(duì)象扬霜。
 *
 * Serializable(Java自帶):
 * Serializable是序列化的意思谭羔,表示將一個(gè)對(duì)象轉(zhuǎn)換成可存儲(chǔ)或可傳輸?shù)臓顟B(tài)。序列化后的對(duì)象可以在網(wǎng)絡(luò)上進(jìn)行傳輸吓著,也可以存儲(chǔ)到本地挤安。
 *
 * Parcelable(android 專用):
 * 除了Serializable之外絮记,使用Parcelable也可以實(shí)現(xiàn)相同的效果,
 * 不過(guò)不同于將對(duì)象進(jìn)行序列化设褐,Parcelable方式的實(shí)現(xiàn)原理是將一個(gè)完整的對(duì)象進(jìn)行分解,
 * 而分解后的每一部分都是Intent所支持的數(shù)據(jù)類(lèi)型,這樣也就實(shí)現(xiàn)傳遞對(duì)象的功能了巫玻。
 要求被傳遞的對(duì)象必須實(shí)現(xiàn)上述2種接口中的一種才能通過(guò)Intent直接傳遞贱鄙。
 */
public class MainActivity extends Activity {
    private TextView mTvOpenNew;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.mTvOpenNew).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent open = new Intent(MainActivity.this,SecondActivity.class);
                Person person = new Person();
                person.setName("一去二三里");
                person.setAge(18);
                // 傳輸方式一,intent直接調(diào)用putExtra
                // public Intent putExtra(String name, Serializable value)
                open.putExtra("put_ser_test", person);
                // 傳輸方式二姨谷,intent利用putExtras(注意s)傳入bundle
                /**
                Bundle bundle = new Bundle();
                bundle.putSerializable("bundle_ser",person);
                open.putExtras(bundle);
                 */
                startActivity(open);
            }
        });
    }
}

SecondActivity

package com.amqr.serializabletest;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import com.amqr.serializabletest.entity.Person;
/**
 * User: LJM
 * Date&Time: 2016-02-22 & 11:56
 * Describe: Describe Text
 */
public class SecondActivity extends Activity{
    private TextView mTvDate;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        mTvDate = (TextView) findViewById(R.id.mTvDate);
        Intent intent = getIntent();
        // 關(guān)鍵方法:getSerializableExtra 逗宁,我們的類(lèi)是實(shí)現(xiàn)了Serializable接口的,所以寫(xiě)這個(gè)方法獲得對(duì)象
        // public class Person implements Serializable
        Person per = (Person)intent.getSerializableExtra("put_ser_test");
        //Person per = (Person)intent.getSerializableExtra("bundle_ser");
        mTvDate.setText("名字:"+per.getName()+"\\n"
                +"年齡:"+per.getAge());
    }
}
Serializable的序列化.gif

Serializable 到此完成

三菠秒、android專用的Parcelable的序列化的例子

我們寫(xiě)一個(gè)實(shí)體類(lèi)疙剑,實(shí)現(xiàn)Parcelable接口,馬上就被要求

1践叠、復(fù)寫(xiě)describeContents方法和writeToParcel方法

2言缤、實(shí)例化靜態(tài)內(nèi)部對(duì)象CREATOR,實(shí)現(xiàn)接口Parcelable.Creator 禁灼。

也就是管挟,隨便一個(gè)類(lèi)實(shí)現(xiàn)了Parcelable接口就一開(kāi)始就會(huì)變成這樣子

Parcelable方式的實(shí)現(xiàn)原理是將一個(gè)完整的對(duì)象進(jìn)行分解,而分解后的每一部分都是Intent所支持的數(shù)據(jù)類(lèi)型弄捕,這樣也就實(shí)現(xiàn)傳遞對(duì)象的功能了僻孝。

public class Pen implements Parcelable{
    private String color;
    private int size;
    protected Pen(Parcel in) {
        color = in.readString();
        size = in.readInt();
    }
    public static final Creator<Pen> CREATOR = new Creator<Pen>() {
        @Override
        public Pen createFromParcel(Parcel in) {
            return new Pen(in);
        }
        @Override
        public Pen[] newArray(int size) {
            return new Pen[size];
        }
    };
    @Override
    public int describeContents() {
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(color);
        dest.writeInt(size);
    }
}

系統(tǒng)已經(jīng)幫我們做了很多事情,我們需要做的很簡(jiǎn)單守谓,就寫(xiě)寫(xiě)我們自己需要的構(gòu)造方法穿铆,寫(xiě)一下私有變量的get和set

大概變成這樣子:

package com.amqr.serializabletest.entity;
import android.os.Parcel;
import android.os.Parcelable;
/**
 * User: LJM
 * Date&Time: 2016-02-22 & 14:52
 * Describe: Describe Text
 */
public class Pen implements Parcelable{
    private String color;
    private int size;
    
    // 系統(tǒng)自動(dòng)添加,給createFromParcel里面用
    protected Pen(Parcel in) {
        color = in.readString();
        size = in.readInt();
    }
    public static final Creator<Pen> CREATOR = new Creator<Pen>() {
        /**
         *
         * @param in
         * @return
         * createFromParcel()方法中我們要去讀取剛才寫(xiě)出的name和age字段斋荞,
         * 并創(chuàng)建一個(gè)Person對(duì)象進(jìn)行返回荞雏,其中color和size都是調(diào)用Parcel的readXxx()方法讀取到的,
         * 注意這里讀取的順序一定要和剛才寫(xiě)出的順序完全相同平酿。
         * 讀取的工作我們利用一個(gè)構(gòu)造函數(shù)幫我們完成了
         */
        @Override
        public Pen createFromParcel(Parcel in) {
            return new Pen(in); // 在構(gòu)造函數(shù)里面完成了 讀取 的工作
        }
        //供反序列化本類(lèi)數(shù)組時(shí)調(diào)用的
        @Override
        public Pen[] newArray(int size) {
            return new Pen[size];
        }
    };
    
    @Override
    public int describeContents() {
        return 0;  // 內(nèi)容接口描述凤优,默認(rèn)返回0即可。
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(color);  // 寫(xiě)出 color
        dest.writeInt(size);  // 寫(xiě)出 size
    }
    // ======分割線蜈彼,寫(xiě)寫(xiě)get和set
    //個(gè)人自己添加
    public Pen() {
    }
    //個(gè)人自己添加
    public Pen(String color, int size) {
        this.color = color;
        this.size = size;
    }
    
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public int getSize() {
        return size;
    }
    public void setSize(int size) {
        this.size = size;
    }
}

其實(shí)說(shuō)起來(lái)Parcelable寫(xiě)起來(lái)也不是很麻煩筑辨,在as里面,我們的一個(gè)實(shí)體類(lèi)寫(xiě)好私有變量之后幸逆,讓這個(gè)類(lèi)繼承自Parcelable棍辕,接下的步驟是:

1暮现、復(fù)寫(xiě)兩個(gè)方法,分別是describeContents和writeToParcel

2痢毒、實(shí)例化靜態(tài)內(nèi)部對(duì)象CREATOR送矩,實(shí)現(xiàn)接口Parcelable.Creator 。 以上這兩步系統(tǒng)都已經(jīng)幫我們自動(dòng)做好了

3哪替、自己寫(xiě)寫(xiě)我們所需要的構(gòu)造方法栋荸,變量的get和set

實(shí)現(xiàn)自Parcelable實(shí)體Bean已經(jīng)寫(xiě)好了,接下來(lái)我們結(jié)合MainActivity和ThirdActivity來(lái)使用以下:

MainActivity

package com.amqr.serializabletest;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import com.amqr.serializabletest.entity.Pen;
import com.amqr.serializabletest.entity.Person;
/**
 * 進(jìn)行Android開(kāi)發(fā)的時(shí)候凭舶,我們都知道不能將對(duì)象的引用傳給Activities或者Fragments晌块,
 * 我們需要將這些對(duì)象放到一個(gè)Intent或者Bundle里面,然后再傳遞帅霜。
 *
 *
 * Android中Intent如果要傳遞類(lèi)對(duì)象匆背,可以通過(guò)兩種方式實(shí)現(xiàn)。
 * 方式一:Serializable身冀,要傳遞的類(lèi)實(shí)現(xiàn)Serializable接口傳遞對(duì)象钝尸,
 * 方式二:Parcelable,要傳遞的類(lèi)實(shí)現(xiàn)Parcelable接口傳遞對(duì)象搂根。
 *
 * Serializable(Java自帶):
 * Serializable是序列化的意思珍促,表示將一個(gè)對(duì)象轉(zhuǎn)換成可存儲(chǔ)或可傳輸?shù)臓顟B(tài)。序列化后的對(duì)象可以在網(wǎng)絡(luò)上進(jìn)行傳輸剩愧,也可以存儲(chǔ)到本地猪叙。
 *
 * Parcelable(android 專用):
 * 除了Serializable之外,使用Parcelable也可以實(shí)現(xiàn)相同的效果仁卷,
 * 不過(guò)不同于將對(duì)象進(jìn)行序列化穴翩,Parcelable方式的實(shí)現(xiàn)原理是將一個(gè)完整的對(duì)象進(jìn)行分解,
 * 而分解后的每一部分都是Intent所支持的數(shù)據(jù)類(lèi)型锦积,這樣也就實(shí)現(xiàn)傳遞對(duì)象的功能了芒帕。
 要求被傳遞的對(duì)象必須實(shí)現(xiàn)上述2種接口中的一種才能通過(guò)Intent直接傳遞。
 */
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.mTvOpenNew).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent open = new Intent(MainActivity.this, SecondActivity.class);
                Person person = new Person();
                person.setName("一去二三里");
                person.setAge(18);
                // 傳輸方式一丰介,intent直接調(diào)用putExtra
                // public Intent putExtra(String name, Serializable value)
                open.putExtra("put_ser_test", person);
                // 傳輸方式二背蟆,intent利用putExtras(注意s)傳入bundle
                /**
                 Bundle bundle = new Bundle();
                 bundle.putSerializable("bundle_ser",person);
                 open.putExtras(bundle);
                 */
                startActivity(open);
            }
        });
        // 采用Parcelable的方式
        findViewById(R.id.mTvOpenThird).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent mTvOpenThird = new Intent(MainActivity.this,ThirdActivity.class);
                Pen tranPen = new Pen();
                tranPen.setColor("big red");
                tranPen.setSize(98);
                // public Intent putExtra(String name, Parcelable value)
                mTvOpenThird.putExtra("parcel_test",tranPen);
                startActivity(mTvOpenThird);
            }
        });
    }
}

ThirdActivity

package com.amqr.serializabletest;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import com.amqr.serializabletest.entity.Pen;
/**
 * User: LJM
 * Date&Time: 2016-02-22 & 14:47
 * Describe: Describe Text
 */
public class ThirdActivity extends Activity{
    private TextView mTvThirdDate;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);
        mTvThirdDate = (TextView) findViewById(R.id.mTvThirdDate);
//        Intent intent = getIntent();
//        Pen pen = (Pen)intent.getParcelableExtra("parcel_test");
        Pen pen = (Pen)getIntent().getParcelableExtra("parcel_test");
        mTvThirdDate = (TextView) findViewById(R.id.mTvThirdDate);
        mTvThirdDate.setText("顏色:"+pen.getColor()+"\\n"
                            +"大小:"+pen.getSize());
    }
}

Parcelable的方式.gif

完成,Serializable 和Parcelable 這兩種方式都介紹完成了基矮。接下說(shuō)一說(shuō)對(duì)比

四淆储、Serializable 和Parcelable的對(duì)比

android上應(yīng)該盡量采用Parcelable冠场,效率至上

編碼上:

Serializable代碼量少家浇,寫(xiě)起來(lái)方便

Parcelable代碼多一些

效率上:

Parcelable的速度比高十倍以上

serializable的迷人之處在于你只需要對(duì)某個(gè)類(lèi)以及它的屬性實(shí)現(xiàn)Serializable 接口即可。Serializable 接口是一種標(biāo)識(shí)接口(marker interface)碴裙,這意味著無(wú)需實(shí)現(xiàn)方法钢悲,Java便會(huì)對(duì)這個(gè)對(duì)象進(jìn)行高效的序列化操作点额。

這種方法的缺點(diǎn)是使用了反射,序列化的過(guò)程較慢莺琳。這種機(jī)制會(huì)在序列化的時(shí)候創(chuàng)建許多的臨時(shí)對(duì)象还棱,容易觸發(fā)垃圾回收。

Parcelable方式的實(shí)現(xiàn)原理是將一個(gè)完整的對(duì)象進(jìn)行分解惭等,而分解后的每一部分都是Intent所支持的數(shù)據(jù)類(lèi)型珍手,這樣也就實(shí)現(xiàn)傳遞對(duì)象的功能了

五、demo

http://pan.baidu.com/s/1dDLGWKD

參考

Android中Parcelable接口用法
http://www.cnblogs.com/renqingping/archive/2012/10/25/Parcelable.html

Android系統(tǒng)中Parcelable和Serializable的區(qū)別
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0204/2410.html

第一行代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辞做,一起剝皮案震驚了整個(gè)濱河市琳要,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秤茅,老刑警劉巖稚补,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異框喳,居然都是意外死亡课幕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)五垮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)乍惊,“玉大人,你說(shuō)我怎么就攤上這事拼余∥坭耄” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵匙监,是天一觀的道長(zhǎng)凡橱。 經(jīng)常有香客問(wèn)我,道長(zhǎng)亭姥,這世上最難降的妖魔是什么稼钩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮达罗,結(jié)果婚禮上坝撑,老公的妹妹穿的比我還像新娘。我一直安慰自己粮揉,他們只是感情好巡李,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著扶认,像睡著了一般侨拦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辐宾,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天狱从,我揣著相機(jī)與錄音膨蛮,去河邊找鬼。 笑死季研,一個(gè)胖子當(dāng)著我的面吹牛敞葛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播与涡,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼惹谐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了驼卖?” 一聲冷哼從身側(cè)響起豺鼻,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎款慨,沒(méi)想到半個(gè)月后儒飒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡檩奠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年桩了,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埠戳。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡井誉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出整胃,到底是詐尸還是另有隱情颗圣,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布屁使,位于F島的核電站在岂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蛮寂。R本人自食惡果不足惜蔽午,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酬蹋。 院中可真熱鬧及老,春花似錦、人聲如沸范抓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)匕垫。三九已至僧鲁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悔捶。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留单芜,地道東北人蜕该。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像洲鸠,于是被迫代替她去往敵國(guó)和親堂淡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容