精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

詳解LUA腳本語言之?dāng)?shù)據(jù)文件與持久化

移動開發(fā) iOS
一個健壯的程序不僅應(yīng)該可以讀取存有正確格式的數(shù)據(jù)還應(yīng)該能夠處理壞文件,正因為如此,實(shí)現(xiàn)一 個健壯的讀取數(shù)據(jù)文件的程序是很困難的。

LUA腳本語言之數(shù)據(jù)文件與持久化是本文要介紹的內(nèi)容,當(dāng)我們處理數(shù)據(jù)文件的,一般來說,寫文件比讀取文件內(nèi)容來的容易。因為我們可以很好的控制文件的寫操作,而從文件讀取數(shù)據(jù)常常碰到不可預(yù)知的情況。

一個健壯的程序不僅應(yīng)該可以讀取存有正確格式的數(shù)據(jù)還應(yīng)該能夠處理壞文件(譯者注:對數(shù)據(jù)內(nèi)容和格式進(jìn)行校驗,對異常情況能夠做出恰當(dāng)處理)。正因為如此,實(shí)現(xiàn)一 個健壯的讀取數(shù)據(jù)文件的程序是很困難的。

文件格式可以通過使用Lua中的table構(gòu)造器來描述,我們只需要在寫數(shù)據(jù)的稍微做一些做一點(diǎn)額外的工作,讀取數(shù)據(jù)將變得容易很多。方法是:將我們的數(shù)據(jù)文件內(nèi)容作為Lua代碼寫到Lua程序中去。通過使用table構(gòu)造器,這些存放在Lua代碼中的數(shù)據(jù)可以像其他普通的文件一樣看起來引人注目。

為了更清楚地描述問題,下面我們看看例子。如果我們的數(shù)據(jù)是預(yù)先確定的格式,比如CSV(逗號分割值),我們幾乎沒得選擇。但是如果我們打算創(chuàng)建一個文件為了將來使用,除了CSV,我們可以使用Lua構(gòu)造器來我們表述我們數(shù)據(jù),這種情況下,我們將每一個數(shù)據(jù)記錄描述為一個Lua構(gòu)造器。將下面的代碼

  1. Donald E. Knuth,Literate Programming,CSLI,1992  
  2. Jon Bentley,More Programming Pearls,Addison-Wesley,1990  
  3. 寫成  
  4. Entry{"Donald E. Knuth",  
  5. "Literate Programming",  
  6. "CSLI",  
  7. 1992}  
  8.    
  9. Entry{"Jon Bentley",  
  10. "More Programming Pearls",  
  11. "Addison-Wesley",  
  12. 1990} 

記住Entry{...}與Entry({...})等價,他是一個以表作為唯一參數(shù)的函數(shù)調(diào)用。所以,前面那段數(shù)據(jù)在Lua程序中表示如上。如果要讀取這個段數(shù)據(jù),我們只需要運(yùn)行我們的Lua代碼。例如下面這段代碼計算數(shù)據(jù)文件中記錄數(shù):

  1. local count = 0 
  2. function Entry (b) countcount = count + 1 end  
  3. dofile("data")  
  4. print("number of entries: " .. count) 

下面這段程序收集一個作者名列表中的名字是否在數(shù)據(jù)文件中出現(xiàn),如果在文件中出現(xiàn)則打印出來。(作者名字是Entry的第一個域;所以,如果b是一個entry的值,b[1]則代表作者名)

  1. local authors = {}       -- a set to collect authors  
  2. function Entry (b) authors[b[1]] = true end  
  3. dofile("data")  
  4. for name in pairs(authors) do print(name) end 

注意,在這些程序段中使用事件驅(qū)動的方法:Entry函數(shù)作為回調(diào)函數(shù),dofile處理數(shù)據(jù)文件中的每一記錄都回調(diào)用它。當(dāng)數(shù)據(jù)文件的大小不是太大的情況下,我們可以使用name-value對來描述數(shù)據(jù):

  1. Entry{  
  2. author = "Donald E. Knuth",  
  3. title = "Literate Programming",  
  4. publisher = "CSLI",  
  5. year = 1992 
  6. }  
  7.    
  8. Entry{  
  9. author = "Jon Bentley",  
  10. title = "More Programming Pearls",  
  11. publisher = "Addison-Wesley",  
  12. year = 1990 

(如果這種格式讓你想起B(yǎng)ibTeX,這并不奇怪。Lua中構(gòu)造器正是根據(jù)來自BibTeX的靈感實(shí)現(xiàn)的)這種格式我們稱之為自描述數(shù)據(jù)格式,因為每一個數(shù)據(jù)段都根據(jù)他的意思簡短的描述為一種數(shù)據(jù)格式。相對CSV和其他緊縮格式,自描述數(shù)據(jù)格式更容易閱讀和理解,當(dāng)需要修改的時候可以容易的手工編輯,而且不需要改動數(shù)據(jù)文件。例如,如果我們想增加一個域,只需要對讀取程序稍作修改即可,當(dāng)指定的域不存在時,也可以賦予默認(rèn)值。使用name-value對描述的情況下,上面收集作者名的代碼可以改寫為:

  1. local authors = {} -- a set to collect authors  
  2. function Entry (b) authors[b.author] = true end  
  3. dofile("data")  
  4. for name in pairs(authors) do print(name) end 

現(xiàn)在,記錄域的順序無關(guān)緊要了,甚至某些記錄即使不存在author這個域,我們也只需要稍微改動一下代碼即可:

  1. function Entry (b)  
  2. if b.author then authors[b.author] = true end  
  3. end 

Lua不僅運(yùn)行速度快,編譯速度也快。例如,上面這段搜集作者名的代碼處理一個2MB的數(shù)據(jù)文件時間不會超過1秒。另外,這不是偶然的,數(shù)據(jù)描述是Lua的主要應(yīng)用之一,從Lua發(fā)明以來,我們花了很多心血使他能夠更快的編譯和運(yùn)行大的chunks。

序列化

我們經(jīng)常需要序列化一些數(shù)據(jù),為了將數(shù)據(jù)轉(zhuǎn)換為字節(jié)流或者字符流,這樣我們就可以保存到文件或者通過網(wǎng)絡(luò)發(fā)送出去。我們可以在Lua代碼中描述序列化的數(shù)據(jù),在這種方式下,我們運(yùn)行讀取程序即可從代碼中構(gòu)造出保存的值。

通常,我們使用這樣的方式varname = <exp>來保存一個全局變量的值。varname部分比較容易理解,下面我們來看看如何寫一個產(chǎn)生值的代碼。對于一個數(shù)值來說:

  1. function serialize (o)  
  2.     if type(o) == "number" then  
  3.        io.write(o)  
  4.     else ...  
  5. end 

對于字符串值而言,原始的寫法應(yīng)該是:

  1. if type(o) == "string" then  
  2.     io.write("'", o, "'") 

然而,如果字符串包含特殊字符(比如引號或者換行符),產(chǎn)生的代碼將不是有效的Lua程序。這時候你可能用下面方法解決特殊字符的問題:

  1. if type(o) == "string" then  
  2.     io.write("[[", o, "]]") 

千萬不要這樣做!雙引號是針對手寫的字符串的而不是針對自動產(chǎn)生的字符串。如果有人惡意的引導(dǎo)你的程序去使用" ]]..os.execute('rm *')..[[ "這樣的方式去保存某些東西(比如它可能提供字符串作為地址)你最終的chunk將是這個樣子:

  1. varname = [[ ]]..os.execute('rm *')..[[ ]] 

如果你load這個數(shù)據(jù),運(yùn)行結(jié)果可想而知的。為了以安全的方式引用任意的字符串,string標(biāo)準(zhǔn)庫提供了格式化函數(shù)專門提供"%q"選項。它可以使用雙引號表示字符串并且可以正確的處理包含引號和換行等特殊字符的字符串。這樣一來,我們的序列化函數(shù)可以寫為:

  1. function serialize (o)  
  2.     if type(o) == "number" then  
  3.        io.write(o)  
  4.     elseif type(o) == "string" then  
  5.        io.write(string.format("%q", o))  
  6.     else ...  
  7. end 

保存不帶循環(huán)的table

我們下一個艱巨的任務(wù)是保存表。根據(jù)表的結(jié)構(gòu)不同,采取的方法也有很多。沒有一種單一的算法對所有情況都能很好地解決問題。簡單的表不僅需要簡單的算法而且輸出文件也需要看起來美觀。

我們第一次嘗試如下:

  1. function serialize (o)  
  2.     if type(o) == "number" then  
  3.        io.write(o)  
  4.     elseif type(o) == "string" then  
  5.        io.write(string.format("%q", o))  
  6.     elseif type(o) == "table" then  
  7.        io.write("{\n")  
  8.        for k,v in pairs(o) do  
  9.            io.write(" ", k, " = ")  
  10.            serialize(v)  
  11.            io.write(",\n")  
  12.        end  
  13.        io.write("}\n")  
  14.     else  
  15.        error("cannot serialize a " .. type(o))  
  16.     end  
  17. end 

盡管代碼很簡單,但很好地解決了問題。只要表結(jié)構(gòu)是一個樹型結(jié)構(gòu)(也就是說,沒有共享的子表并且沒有循環(huán)),上面代碼甚至可以處理嵌套表(表中表)。對于所進(jìn)不整齊的表我們可以少作改進(jìn)使結(jié)果更美觀,這可以作為一個練習(xí)嘗試一下。

(提示:增加一個參數(shù)表示縮進(jìn)的字符串,來進(jìn)行序列化)。前面的函數(shù)假定表中出現(xiàn)的所有關(guān)鍵字都是合法的標(biāo)示符。如果表中有不符合Lua語法的數(shù)字關(guān)鍵字或者字符串關(guān)鍵字,上面的代碼將碰到麻煩。一個簡單的解決這個難題的方法是將:

  1. io.write(" ", k, " = ")  
  2. 改為  
  3. io.write(" [")  
  4. serialize(k)  
  5. io.write("] = ") 

這樣一來,我們改善了我們的函數(shù)的健壯性,比較一下兩次的結(jié)果:

  1. result of serialize{a=12b='Lua'key='another "one"'

第一個版本

  1. {  
  2. a = 12,  
  3. b = "Lua",  
  4. key = "another \"one\"",  

第二個版本

  1. {  
  2. ["a"] = 12,  
  3. ["b"] = "Lua",  
  4. ["key"] = "another \"one\"",  

我們可以通過測試每一種情況,看是否需要方括號,另外,我們將這個問題留作一個練習(xí)給大家。

保存帶有循環(huán)的table

針對普通拓?fù)涓拍钌系膸в醒h(huán)表和共享子表的table,我們需要另外一種不同的方法來處理。構(gòu)造器不能很好地解決這種情況,我們不使用。為了表示循環(huán)我們需要將表名記錄下來,下面我們的函數(shù)有兩個參數(shù):table和對應(yīng)的名字。另外,我們還必須記錄已經(jīng)保存過的table以防止由于循環(huán)而被重復(fù)保存。我們使用一個額外的table來記錄保存過的表的軌跡,這個表的下表索引為table,而值為對應(yīng)的表名。

我們做一個限制:要保存的table只有一個字符串或者數(shù)字關(guān)鍵字。下面的這個函數(shù)序列化基本類型并返回結(jié)果。

  1. function basicSerialize (o)  
  2.     if type(o) == "number" then  
  3.        return tostring(o)  
  4.     else       -- assume it is a string  
  5.        return string.format("%q", o)  
  6.     end  
  7. end 

關(guān)鍵內(nèi)容在接下來的這個函數(shù),saved這個參數(shù)是上面提到的記錄已經(jīng)保存的表的蹤跡的table。

  1. function save (name, value, saved)  
  2.     savedsaved = saved or {}         -- initial value  
  3.     io.write(name, " = ")  
  4.     if type(value) == "number" or type(value) == "string" then  
  5.        io.write(basicSerialize(value), "\n")  
  6.     elseif type(value) == "table" then  
  7.        if saved[value] then     -- value already saved?  
  8.            -- use its previous name  
  9.            io.write(saved[value], "\n")  
  10.        else  
  11.            saved[value] = name -- save name for next time  
  12.            io.write("{}\n")     -- create a new table  
  13.            for k,v in pairs(value) do -- save its fields  
  14.               local fieldname = string.format("%s[%s]", name,  
  15.                                         basicSerialize(k))  
  16.               save(fieldname, v, saved)  
  17.            end  
  18.        end  
  19.     else  
  20.        error("cannot save a " .. type(value))  
  21.     end  
  22. end 

舉個例子:

我們將要保存的table為:

  1. a = {x=1y=2; {3,4,5}}  
  2. a[2] = a      -- cycle  
  3. aa.z = a[1]    -- shared sub-table 

調(diào)用save('a', a)之后結(jié)果為:

  1. a = {}  
  2. a[1] = {}  
  3. a[1][1] = 3  
  4. a[1][2] = 4  
  5. a[1][3] = 5  
  6.    
  7. a[2] = a  
  8. a["y"] = 2  
  9. a["x"] = 1  
  10. a["z"] = a[1] 

(實(shí)際的順序可能有所變化,它依賴于table遍歷的順序,不過,這個算法保證了一個新的定義中需要的前面的節(jié)點(diǎn)都已經(jīng)被定義過)

如果我們想保存帶有共享部分的表,我們可以使用同樣table的saved參數(shù)調(diào)用save函數(shù),例如我們創(chuàng)建下面兩個表:

  1. a = {{"one", "two"}, 3}  
  2. b = {k = a[1]} 

保存它們:

  1. save('a', a)  
  2. save('b', b) 

結(jié)果將分別包含相同部分:

  1. a = {}  
  2. a[1] = {}  
  3. a[1][1] = "one"  
  4. a[1][2] = "two"  
  5. a[2] = 3  
  6. b = {}  
  7. b["k"] = {}  
  8. b["k"][1] = "one"  
  9. b["k"][2] = "two" 

然而如果我們使用同一個saved表來調(diào)用save函數(shù):

  1. local t = {}  
  2. save('a', a, t)  
  3. save('b', b, t) 

結(jié)果將共享相同部分:

  1. a = {}  
  2. a[1] = {}  
  3. a[1][1] = "one"  
  4. a[1][2] = "two"  
  5. a[2] = 3  
  6. b = {}  
  7. b["k"] = a[1] 

上面這種方法是Lua中常用的方法,當(dāng)然也有其他一些方法可以解決問題。比如,我們可以不使用全局變量名來保存,即使用封包,用chunk構(gòu)造一個local值然后返回之;通過構(gòu)造一張表,每張表名與其對應(yīng)的函數(shù)對應(yīng)起來等。Lua給予你權(quán)力,由你決定如何實(shí)現(xiàn)。

小結(jié):詳解LUA腳本語言之數(shù)據(jù)文件與持久化的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對你有所幫助!

責(zé)任編輯:zhaolei 來源: 網(wǎng)易博客
相關(guān)推薦

2011-08-24 13:32:17

2011-08-22 18:00:53

Lua語言

2011-08-22 16:59:28

Lua

2011-08-25 11:02:04

2011-08-25 10:40:21

Lua游戲

2011-08-22 17:41:23

LUA 腳本 語言

2011-08-25 09:55:27

2011-08-23 09:44:28

LUA腳本

2011-08-22 18:08:09

Lua腳本

2009-08-17 10:08:24

2011-06-22 14:07:42

Lua

2010-07-16 12:52:35

JVMJVM腳本語言Groovy

2021-03-18 08:18:15

ZooKeeper數(shù)據(jù)持久化

2013-09-27 09:43:44

Linux Shell腳本數(shù)學(xué)表達(dá)式

2010-07-13 14:09:07

SQL Server數(shù)

2010-02-24 14:04:32

Python腳本語言

2009-06-10 08:41:15

Linux腳本語言

2011-08-24 17:15:33

Lua源代碼文件

2024-09-29 09:25:53

2023-08-17 16:17:00

Docker前端
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

91在线视频免费| 日韩在线免费av| 男人天堂网视频| 伊人网av在线| 欧美激情aⅴ一区二区三区| 精品国产一区二区三区不卡 | 久久av免费| 欧美亚洲丝袜传媒另类| 99热这里只有精品免费| 青青视频在线观| 久久精品99久久久| 91国内精品久久| 精品国产国产综合精品| 老司机精品视频在线播放| 欧美午夜一区二区三区| 黄色激情在线视频| 男人天堂网在线视频| 日本不卡一区二区| 97在线精品视频| 欧美xxxooo| 中文字幕精品影院| 精品人在线二区三区| 最近中文字幕一区二区| 九九精品调教| 国产精品久久久久四虎| 91免费人成网站在线观看18| 天堂网视频在线| 国产中文精品久高清在线不| 欧美mv日韩mv国产| 亚洲精品成人在线播放| 男人最爱成人网| 亚洲一区二区三区不卡国产欧美| 国新精品乱码一区二区三区18| 日本一区二区三区免费视频| 天天做天天爱综合| 亚洲少妇激情视频| 亚洲av无码一区二区三区观看| 3d欧美精品动漫xxxx无尽| 亚洲国产成人精品视频| 蜜桃精品久久久久久久免费影院| 中文字幕av第一页| 国产精品腿扒开做爽爽爽挤奶网站| 亚洲免费中文字幕| 在线视频 日韩| 亚洲一区二区三区在线免费| 91精品国产福利在线观看| 天天色综合社区| 欧美人与动牲性行为| 亚洲色图视频网| 一区二区三区我不卡| 成人免费高清在线播放| 国产校园另类小说区| 精品视频第一区| 五月色婷婷综合| 99久久精品免费看| 国产日产久久高清欧美一区| 久久久久久久久久91| 91成人免费| 久久精品欧美视频| 91精品小视频| 亚瑟一区二区三区四区| 日韩经典第一页| 欧美 日本 国产| 国产精品免费99久久久| 中文欧美日本在线资源| 亚洲少妇xxx| 99热在线成人| 欧美国产精品人人做人人爱| 日产精品久久久久| 夜夜精品视频| 国产成人综合av| 怡春院在线视频| 国模一区二区三区白浆| 国产精品久久久久久超碰| 在线观看av大片| 黑人巨大精品欧美一区| 超碰97在线播放| 天堂中文在线资| 欧美激情中文字幕一区二区| 在线观看一区二区三区三州| 欧美人与禽性xxxxx杂性| 婷婷亚洲久悠悠色悠在线播放| 在线视频一二三区| 超碰在线97国产| 色狠狠一区二区| 亚洲黄色片免费| 超碰97成人| 国产小视频91| 一区二区成人免费视频| 欧美大人香蕉在线| 欧美极品在线播放| 天堂网免费视频| 国产在线麻豆精品观看| 国产精品一区=区| 性做久久久久久久| 久久精品人人做| 久久国产精品免费观看| 午夜影院一区| 91精品综合久久久久久| aaa一级黄色片| 亚洲ab电影| 久久夜精品va视频免费观看| 日韩av大片在线观看| 美女脱光内衣内裤视频久久网站| 国产精品美女www| 国产乱码77777777| 日韩av电影免费观看高清完整版| 日韩免费在线看| aa视频在线免费观看| 久久久久高清精品| 日韩av一级大片| 最爽无遮挡行房视频在线| 欧美视频在线视频| 韩国三级与黑人| 欧美一区二区三| 中文字幕国产亚洲2019| 懂色av.com| 国产在线精品一区在线观看麻豆| 国产不卡一区二区在线观看| 3d成人动漫在线| 亚洲猫色日本管| 国产乱码在线| 欧美激情网址| 久久精品视频在线播放| 国产91在线播放九色| 午夜一区不卡| 国产精品国产三级欧美二区| 日本免费不卡视频| 91视频www| 国产九色porny| 精品一区二区三区亚洲| 亚洲国产福利在线| 免费看污片网站| 亚洲国内精品| 97夜夜澡人人双人人人喊| 瑟瑟视频在线| 欧美性做爰猛烈叫床潮| 在线观看福利片| 国产一区二区你懂的| 国产精品yjizz| 免费av在线电影| 亚洲不卡一区二区三区| 在线播放国产视频| 在线观看国产精品入口| 成人性生交大片免费观看嘿嘿视频| 精品久久久免费视频| www国产成人| 六月丁香激情网| 女同另类激情重口| 97精品伊人久久久大香线蕉 | 国产女人18毛片水真多| 中文字幕第一区综合| 看av免费毛片手机播放| 婷婷综合一区| 欧美亚洲国产成人精品| 视频二区在线| 91九色02白丝porn| 免费黄色在线网址| 99日韩精品| 久久精品ww人人做人人爽| 蜜桃av在线| 亚洲欧美另类人妖| 国产91av在线播放| 国产精品色婷婷久久58| 91丝袜超薄交口足| 精品国产一区二区三区小蝌蚪 | 国产传媒av在线| 亚洲国内高清视频| 欧美日韩国产精品一区二区三区| 日韩av二区在线播放| 在线国产精品网| 日本精品视频| 91精品国产高清| 黄色av网站在线免费观看| 欧美三级电影精品| avtt天堂在线| 91麻豆免费看| 欧美wwwwwww| 中出一区二区| 精品国产日本| www.国产精品| 欧美第一黄色网| 日本一本草久在线中文| 欧美三级电影网| 精品视频一区二区在线观看| 久久女同精品一区二区| 亚洲欧美日本一区二区三区| 国语自产精品视频在线看8查询8| 亚洲www在线| 人狥杂交一区欧美二区| 中文字幕精品久久久久| 二区三区在线视频| 一区二区在线观看不卡| 狠狠人妻久久久久久综合蜜桃| 在线视频免费在线观看一区二区| 国产精品yjizz| 成人一级视频| 高清欧美性猛交| av资源网站在线观看| 精品久久久久久综合日本欧美 | 免费a级毛片在线观看| 91精品国产色综合久久不卡蜜臀| 亚洲欧美小视频| 久久蜜桃av一区精品变态类天堂| 国产av无码专区亚洲精品| 五月久久久综合一区二区小说| 91九色单男在线观看| 日本乱码一区二区三区不卡| 亚洲欧美国产视频| 99国产在线播放| 欧洲一区在线电影| 日韩三级小视频| 91免费国产视频网站| 日本网站在线看| 青青国产91久久久久久 | 性一交一乱一伧老太| 欧美在线制服丝袜| 国产午夜视频在线播放| 亚洲色图另类专区| 国产又黄又粗视频| 狠狠色2019综合网| 成人羞羞国产免费网站| 激情久久五月| 精品嫩模一区二区三区| 日韩欧美自拍| 人禽交欧美网站免费| 欧美人妖在线观看| 国产高清一区视频| 一区二区电影免费观看| 欧美高清一级大片| 国产调教视频在线观看| 亚洲精品国精品久久99热 | 黄色片免费网址| 黄色工厂这里只有精品| 热这里只有精品| 99精品一区| 亚洲一区二区三区午夜| 欧美一二区在线观看| 国产精品一区二区三区不卡| 精品欧美视频| 热久久这里只有| 精精国产xxxx视频在线播放| 日韩视频在线免费观看| 99reav在线| 一区二区三区高清国产| 国产乱理伦片a级在线观看| 日韩视频一区二区三区在线播放| 97久久久久久久| 精品久久久久久中文字幕| 亚洲色图100p| 国产精品乱码人人做人人爱| www.日本高清视频| av色综合久久天堂av综合| 国产黑丝一区二区| 精品一区在线看| www.久久av.com| 国产一区二区调教| 在线观看视频你懂得| 国产91精品露脸国语对白| 国产人妖在线观看| 麻豆freexxxx性91精品| 久久久久xxxx| 国产精品亚洲午夜一区二区三区| 久久精品影视大全| 久久99国产精品免费| 青青草原播放器| 粉嫩av一区二区三区| 国内自拍第二页| 国产美女视频一区| 性感美女一区二区三区| 91丨九色丨蝌蚪富婆spa| 欧美人与性囗牲恔配| 久久这里只有精品6| 波多野结衣一二三区| 久久久亚洲综合| 午夜剧场免费看| 国产福利一区二区| 岛国精品资源网站| 国产精品伦理在线| 毛片a片免费观看| 色呦呦国产精品| 国产精品久久久久久久久毛片 | 黑人糟蹋人妻hd中文字幕| 日韩激情在线观看| 熟妇女人妻丰满少妇中文字幕| 久久99精品久久久久久国产越南 | 91久久精品一区二区三区| 国产精品无码一区二区桃花视频| 欧美专区在线观看一区| 国产美女免费视频| 日韩av中文字幕在线播放| 国产区视频在线| 欧美精品午夜视频| 欧美亚洲韩国| 99影视tv| 成人久久综合| 大陆av在线播放| 日本视频一区二区三区| 一级黄色电影片| 国产精品午夜电影| www中文在线| 同产精品九九九| 国产老女人乱淫免费| 亚洲男人第一av网站| 中文字幕伦理免费在线视频| 欧美另类交人妖| 日韩免费va| 国产精品区一区二区三在线播放| 福利电影一区| 一道精品一区二区三区| 在线亚洲成人| 99999精品| 成人性生交大片免费看视频在线| 国产在线不卡av| 成人免费在线播放视频| 亚洲 欧美 日韩 在线| 精品国产网站在线观看| 日本成人网址| 国产精品黄页免费高清在线观看| 色猫猫成人app| 久久精品中文字幕一区二区三区 | 一卡二卡3卡四卡高清精品视频| 久久美女视频| 激情网站五月天| 播五月开心婷婷综合| 少妇人妻丰满做爰xxx| 欧美午夜影院一区| 国产资源在线观看| 欧美综合激情网| 成人爽a毛片| 韩国无码av片在线观看网站| 久久电影网站中文字幕 | 国产精品自拍一区| 中国特黄一级片| 欧美最猛性xxxxx直播| 国模吧精品人体gogo| 国产91成人video| 精品亚洲自拍| 亚洲视频导航| 免费成人在线视频观看| 精人妻一区二区三区| 一区二区三区中文字幕| 精品人妻一区二区三区三区四区| 亚洲欧美日韩精品久久| 欧美裸体视频| 免费影院在线观看一区| 欧美一区=区| 黄色aaa视频| 亚洲亚洲人成综合网络| 亚洲国产综合网| 最近2019年手机中文字幕| 韩国精品视频在线观看| 亚洲欧洲精品一区二区| 另类小说综合欧美亚洲| 一级片一级片一级片| 色综合网站在线| 国产福利在线视频| 国产精品偷伦一区二区| 天天综合网91| 亚洲av无一区二区三区久久| 亚洲一区二区三区中文字幕| 色网站免费观看| 日韩美女在线观看一区| 精品国产91久久久久久浪潮蜜月| 国产婷婷一区二区三区| 97精品视频在线观看自产线路二| 男人与禽猛交狂配| 亚洲第一男人av| 欧美舌奴丨vk视频| 一区在线电影| 日韩—二三区免费观看av| 中国美女黄色一级片| 日韩精品中文字幕在线一区| 免费大片在线观看www| 国产91色在线| 99精品在线观看| 日本wwwxx| 色天使久久综合网天天| 在线日本视频| 不卡一区二区三区四区五区| 亚洲一区久久| 成人欧美一区二区三区黑人一| 色综合久久99| 免费网站免费进入在线| 国产一区再线| 日本午夜一区二区| 久草视频在线资源站| 亚洲欧美一区二区激情| 国产一区二区三区免费观看在线 | 欧美体内谢she精2性欧美| av电影在线网| 国产精品免费在线免费| 国产精品成人一区二区网站软件| 性生活在线视频| 欧美性生交xxxxx久久久| 美女隐私在线观看| 国产又爽又黄的激情精品视频 | 麻豆一区产品精品蜜桃的特点| 欧美一区二区美女| 吉吉日韩欧美|