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

MSON,讓JSON序列化更快

開發(fā) 開發(fā)工具
本文介紹了一種高性能的JSON序列化工具M(jìn)SON,以及它的產(chǎn)生原因和實(shí)現(xiàn)原理。目前我們已經(jīng)有好多性能要求比較高的地方在使用,可以大幅的降低JSON的序列化時(shí)間。

 問題

我們經(jīng)常需要在主線程中讀取一些配置文件或者緩存數(shù)據(jù),最常用的結(jié)構(gòu)化存儲(chǔ)數(shù)據(jù)的方式就是將對(duì)象序列化為JSON字符串保存起來,這種方式特別簡單而且可以和SharedPrefrence配合使用,因此應(yīng)用廣泛。但是目前用到的Gson在序列化JSON時(shí)很慢,在讀取解析這些必要的配置文件時(shí)性能不佳,導(dǎo)致卡頓啟動(dòng)速度減慢等問題。

[[217432]]

Gson的問題在哪里呢?筆者用AndroidStudio的profile工具分析了activity.onCreate方法的耗時(shí)情況。

 

如圖1,可以發(fā)現(xiàn)Gson序列化占用了大部分的執(zhí)行時(shí)間,從圖2可以更直觀地看到Gson.fromJson占用了61%的執(zhí)行時(shí)間。分析Gson的源碼可以發(fā)現(xiàn),它在序列化時(shí)大量使用了反射,每一個(gè)field,每一個(gè)get、set都需要用反射,由此帶來了性能問題。

如何優(yōu)化

知道了性能的瓶頸之后,我們?nèi)绾稳バ薷哪兀课夷芟氲降姆椒ň褪潜M量減少反射。

Android框架中由JSONObject來提供輕量級(jí)的JSON序列化工具,所以我選擇用Android框架中的JSONObject來做序列化,然后手動(dòng)復(fù)制到bean就可以去掉所有的反射。

我做了個(gè)簡單的測(cè)試,分別用Gson和JSONObject的方式去序列化一個(gè)bean,看下各自速度如何。

使用JSONObject的實(shí)現(xiàn)方式如下:

  1. public class Bean { 
  2.  
  3.     public String key
  4.     public String title; 
  5.     public String[] values
  6.     public String defaultValue; 
  7.  
  8.     public static Bean fromJsonString(String json) { 
  9.         try { 
  10.             JSONObject jsonObject = new JSONObject(json); 
  11.             Bean bean = new Bean(); 
  12.             bean.key = jsonObject.optString("key"); 
  13.             bean.title = jsonObject.optString("title"); 
  14.             JSONArray jsonArray = jsonObject.optJSONArray("values"); 
  15.             if (jsonArray != null && jsonArray.length() > 0) { 
  16.                 int len = jsonArray.length(); 
  17.                 bean.values = new String[len]; 
  18.                 for (int i=0; i<len; ++i) { 
  19.                     bean.values[i] = jsonArray.getString(i); 
  20.                 } 
  21.             } 
  22.             bean.defaultValue = jsonObject.optString("defaultValue"); 
  23.  
  24.             return bean; 
  25.         } catch (JSONException e) { 
  26.             e.printStackTrace(); 
  27.         } 
  28.  
  29.         return null
  30.     } 
  31.  
  32.     public static String toJsonString(Bean bean) { 
  33.         if (bean == null) { 
  34.             return null
  35.         } 
  36.         JSONObject jsonObject = new JSONObject(); 
  37.         try { 
  38.             jsonObject.put("key", bean.key); 
  39.             jsonObject.put("title", bean.title); 
  40.             if (bean.values != null) { 
  41.                 JSONArray array = new JSONArray(); 
  42.                 for (String str:bean.values) { 
  43.                     array.put(str); 
  44.                 } 
  45.                 jsonObject.put("values", array); 
  46.             } 
  47.             jsonObject.put("defaultValue", bean.defaultValue); 
  48.         } catch (JSONException e) { 
  49.             e.printStackTrace(); 
  50.         } 
  51.  
  52.         return jsonObject.toString(); 
  53.     } 

測(cè)試代碼:

  1. private void test() { 
  2.     String a = "{\"key\":\"123\", \"title\":\"asd\", \"values\":[\"a\", \"b\", \"c\", \"d\"], \"defaultValue\":\"a\"}"
  3.  
  4.     Gson Gson = new Gson(); 
  5.     Bean testBean = Gson.fromJson(a, new TypeToken<Bean>(){}.getType()); 
  6.  
  7.     long now = System.currentTimeMillis(); 
  8.     for (int i=0; i<1000; ++i) { 
  9.         Gson.fromJson(a, new TypeToken<Bean>(){}.getType()); 
  10.     } 
  11.     Log.d("time""Gson parse use time="+(System.currentTimeMillis() - now)); 
  12.  
  13.     now = System.currentTimeMillis(); 
  14.     for (int i=0; i<1000; ++i) { 
  15.         Bean.fromJsonString(a); 
  16.     } 
  17.     Log.d("time""jsonobject parse use time="+(System.currentTimeMillis() - now)); 
  18.  
  19.     now = System.currentTimeMillis(); 
  20.     for (int i=0; i<1000; ++i) { 
  21.         Gson.toJson(testBean); 
  22.     } 
  23.     Log.d("time""Gson tojson use time="+(System.currentTimeMillis() - now)); 
  24.  
  25.     now = System.currentTimeMillis(); 
  26.     for (int i=0; i<1000; ++i) { 
  27.         Bean.toJsonString(testBean); 
  28.     } 
  29.     Log.d("time""jsonobject tojson use time="+(System.currentTimeMillis() - now)); 

測(cè)試結(jié)果

執(zhí)行1000次JSONObject,花費(fèi)的時(shí)間是Gson的幾十分之一。

工具

雖然JSONObject能夠解決我們的問題,但在項(xiàng)目中有大量的存量代碼都使用了Gson序列化,一處處去修改既耗費(fèi)時(shí)間又容易出錯(cuò),也不方便增加減少字段。

那么有沒有一種方式在使用時(shí)和Gson一樣簡單且性能又特別好呢?

我們調(diào)研了Java的AnnotationProcessor(注解處理器),它能夠在編譯前對(duì)源碼做處理。我們可以通過使用AnnotationProcessor為帶有特定注解的bean自動(dòng)生成相應(yīng)的序列化和反序列化實(shí)現(xiàn),用戶只需要調(diào)用這些方法來完成序列化工作。

我們繼承“AbstractProcessor”,在處理方法中找到有JsonType注解的bean來處理,代碼如下:

  1. @Override 
  2. public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) { 
  3.     Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(JsonType.class); 
  4.     for (Element element : elements) { 
  5.         if (element instanceof TypeElement) { 
  6.             processTypeElement((TypeElement) element); 
  7.         } 
  8.     } 
  9.     return false

然后生成對(duì)應(yīng)的序列化方法,關(guān)鍵代碼如下:

  1. JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile(fullClassName); 
  2. ClassModel classModel = new ClassModel().setModifier("public final").setClassName(simpleClassName); 
  3. ...... 
  4. JavaFile javaFile = new JavaFile(); 
  5. javaFile.setPackageModel(new PackageModel().setPackageName(packageName)) 
  6.         .setImportModel(new ImportModel() 
  7.                 .addImport(elementClassName) 
  8.                 .addImport("com.meituan.android.MSON.IJsonObject"
  9.                 .addImport("com.meituan.android.MSON.IJsonArray"
  10.                 .addImport("com.meituan.android.MSON.exceptions.JsonParseException"
  11.                 .addImports(extension.getImportList()) 
  12.         ).setClassModel(classModel); 
  13.  
  14. List<? extends Element> enclosedElements = element.getEnclosedElements(); 
  15. for (Element e : enclosedElements) { 
  16.     if (e.getKind() == ElementKind.FIELD) { 
  17.         processFieldElement(e, extension, toJsonMethodBlock, fromJsonMethodBlock); 
  18.     } 
  19. try (Writer writer = sourceFile.openWriter()) { 
  20.     writer.write(javaFile.toSourceString()); 
  21.     writer.flush(); 
  22.     writer.close(); 

為了今后接入別的字符串和JSONObject的轉(zhuǎn)換工具,我們封裝了IJSONObject和IJsonArray,這樣可以接入更高效的JSON解析和格式化工具。

繼續(xù)優(yōu)化

繼續(xù)深入測(cè)試發(fā)現(xiàn),當(dāng)JSON數(shù)據(jù)量比較大時(shí)用JSONObject處理會(huì)比較慢,究其原因是JSONObject會(huì)一次性將字符串讀進(jìn)來解析成一個(gè)map,這樣會(huì)有比較大的內(nèi)存浪費(fèi)和頻繁內(nèi)存創(chuàng)建。經(jīng)過調(diào)研Gson內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),發(fā)現(xiàn)Gson底層有流式的解析器而且可以按需解析,可以做到匹配上的字段才去解析。根據(jù)這個(gè)發(fā)現(xiàn)我們將我們IJSONObject和IJsonArray換成了Gson底層的流解析來進(jìn)一步優(yōu)化我們的速度。

代碼如下:

  1. Friend object = new Friend(); 
  2. reader.beginObject(); 
  3. while (reader.hasNext()) { 
  4.     String field = reader.nextName(); 
  5.     if ("id".equals(field)) { 
  6.         object.id = reader.nextInt(); 
  7.     } else if ("name".equals(field)) { 
  8.         if (reader.peek() == JsonToken.NULL) { 
  9.             reader.nextNull(); 
  10.             object.name = null
  11.         } else { 
  12.             object.name = reader.nextString(); 
  13.         } 
  14.     } else { 
  15.         reader.skipValue(); 
  16.     } 
  17. reader.endObject(); 

代碼中可以看到,Gson流解析過程中我們對(duì)于不認(rèn)識(shí)的字段直接調(diào)用skipValue來節(jié)省不必要的時(shí)間浪費(fèi),而且是一個(gè)token接一個(gè)token讀文本流這樣內(nèi)存中不會(huì)存一個(gè)大的JSON字符串。

兼容性

兼容性主要體現(xiàn)在能支持的數(shù)據(jù)類型上,目前MSON支持了基礎(chǔ)數(shù)據(jù)類型,包裝類型、枚舉、數(shù)組、List、Set、Map、SparseArray以及各種嵌套類型(比如:Map<String, Map<String, List<String[]>>>)。

性能及兼容性對(duì)比

我們使用一個(gè)比較復(fù)雜的bean(包含了各種數(shù)據(jù)類型、嵌套類型)分別測(cè)試了Gson、fastjson和MSON的兼容性和性能。

測(cè)試用例如下:

  1. @JsonType 
  2. public class Bean { 
  3.     public Day day
  4.     public List<Day> days; 
  5.     public Day[] days1; 
  6.     @JsonField("filed_a"
  7.     public byte a; 
  8.     public char b; 
  9.     public short c; 
  10.     public int d; 
  11.     public long e; 
  12.     public float f; 
  13.     public double g; 
  14.     public boolean h; 
  15.  
  16.     @JsonField("filed_a1"
  17.     public byte[] a1; 
  18.     public char[] b1; 
  19.     public short[] c1; 
  20.     public int[] d1; 
  21.     public long[] e1; 
  22.     public float[] f1; 
  23.     public double[] g1; 
  24.     public boolean[] h1; 
  25.  
  26.     public Byte a2; 
  27.     public Character b2; 
  28.     public Short c2; 
  29.     public Integer d2; 
  30.     public Long e2; 
  31.     public Float f2; 
  32.     public Double g2; 
  33.     public Boolean h2; 
  34.     @JsonField("name"
  35.     public String i2; 
  36.  
  37.     public Byte[] a3; 
  38.     public Character[] b3; 
  39.     public Short[] c3; 
  40.     public Integer[] d3; 
  41.     public Long[] e3; 
  42.     public Float[] f3; 
  43.     public Double[] g3; 
  44.     public Boolean[] h3; 
  45.     public String[] i3; 
  46.  
  47.     @JsonIgnore 
  48.     public String i4; 
  49.     public transient String i5; 
  50.     public static String i6; 
  51.  
  52.     public List<String> k; 
  53.     public List<Integer> k1; 
  54.     public Collection<Integer> k2; 
  55.     public ArrayList<Integer> k3; 
  56.     public Set<Integer> k4; 
  57.     public HashSet<Integer> k5; 
  58.     // fastjson 序列化會(huì)崩潰所以忽略掉了,下同 
  59.     @com.alibaba.fastjson.annotation.JSONField(serialize = false, deserialize = false
  60.     public List<int[]> k6; 
  61.     public List<String[]> k7; 
  62.     @com.alibaba.fastjson.annotation.JSONField(serialize = false, deserialize = false
  63.     public List<List<Integer>> k8; 
  64.  
  65.     @JsonIgnore 
  66.     public List<Map<String, Integer>> k9; 
  67.     @JsonIgnore 
  68.     public Map<String, String> l; 
  69.     public Map<String, List<Integer>> l1; 
  70.     public Map<Long, List<Integer>> l2; 
  71.     public Map<Map<String, String>, String> l3; 
  72.     public Map<String, Map<String, List<String>>> l4; 
  73.  
  74.     @com.alibaba.fastjson.annotation.JSONField(serialize = false, deserialize = false)  
  75.     public SparseArray<SimpleBean2> m1; 
  76.     @com.alibaba.fastjson.annotation.JSONField(serialize = false, deserialize = false
  77.     public SparseIntArray m2; 
  78.     @com.alibaba.fastjson.annotation.JSONField(serialize = false, deserialize = false
  79.     public SparseLongArray m3; 
  80.     @com.alibaba.fastjson.annotation.JSONField(serialize = false, deserialize = false
  81.     public SparseBooleanArray m4; 
  82.  
  83.     public SimpleBean2 bean; 
  84.     @com.alibaba.fastjson.annotation.JSONField(serialize = false, deserialize = false
  85.     public SimpleBean2[] bean1; 
  86.     @com.alibaba.fastjson.annotation.JSONField(serialize = false, deserialize = false
  87.     public List<SimpleBean2> bean2; 
  88.     @com.alibaba.fastjson.annotation.JSONField(serialize = false, deserialize = false
  89.     public Set<SimpleBean2> bean3; 
  90.     @com.alibaba.fastjson.annotation.JSONField(serialize = false, deserialize = false
  91.     public List<SimpleBean2[]> bean4; 
  92.     @com.alibaba.fastjson.annotation.JSONField(serialize = false, deserialize = false
  93.     public Map<String, SimpleBean2> bean5; 

測(cè)試發(fā)現(xiàn)

Gson的兼容性***,能兼容幾乎所有的類型,MSON其次,fastjson對(duì)嵌套類型支持比較弱。

性能方面MSON***,Gson和fastjson相當(dāng)。

測(cè)試結(jié)果如下:

方法數(shù)

MSON本身方法數(shù)很少只有60個(gè),在使用時(shí)會(huì)對(duì)每一個(gè)標(biāo)注了JsonType的Bean生成2個(gè)方法,分別是:

  1. public String toJson(Bean bean) {...}              // 1 
  2. public Bean fromJson(String data) {...}            // 2 

另外MSON不需要對(duì)任何類做keep處理。

MSON使用方法

下面介紹MSON的使用方法,流程特別簡單:

1. 在Bean上加注解

  1. @JsonType 
  2. public class Bean { 
  3.  
  4.     public String name
  5.     public int age; 
  6.     @JsonField("_desc"
  7.     public String description;  //使用JsonField 標(biāo)注字段在json中的key 
  8.     public transient boolean state; //使用transient 不會(huì)被序列化 
  9.     @JsonIgnore 
  10.     public int state2; //使用JsonIgnore注解 不會(huì)被序列化 
  11.  

2. 在需要序列化的地方

  1. MSON.fromJson(json, clazz); // 反序列化 
  2. MSON.toJson(bean); // 序列化 

結(jié)語

本文介紹了一種高性能的JSON序列化工具M(jìn)SON,以及它的產(chǎn)生原因和實(shí)現(xiàn)原理。目前我們已經(jīng)有好多性能要求比較高的地方在使用,可以大幅的降低JSON的序列化時(shí)間。

【本文為51CTO專欄機(jī)構(gòu)“美團(tuán)點(diǎn)評(píng)技術(shù)團(tuán)隊(duì)”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過微信公眾號(hào)聯(lián)系機(jī)構(gòu)獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2013-03-11 13:55:03

JavaJSON

2021-11-18 07:39:41

Json 序列化Vue

2009-07-29 13:39:02

JSON序列化和反序列ASP.NET AJA

2022-08-06 08:41:18

序列化反序列化Hessian

2016-10-20 15:54:08

Python數(shù)據(jù)序列化

2011-06-01 15:05:02

序列化反序列化

2024-01-30 13:32:51

JSON反序列化序列化

2009-08-24 17:14:08

C#序列化

2018-03-19 10:20:23

Java序列化反序列化

2009-08-06 11:16:25

C#序列化和反序列化

2023-12-13 13:49:52

Python序列化模塊

2011-05-18 15:20:13

XML

2024-10-07 08:26:53

2010-01-08 11:11:38

JSON 序列化

2025-06-06 02:00:00

JavaJSON字段

2024-04-28 08:56:58

大數(shù)據(jù)框架Json

2009-06-14 22:01:27

Java對(duì)象序列化反序列化

2011-06-01 14:50:48

2019-11-20 10:07:23

web安全PHP序列化反序列化

2009-08-25 14:24:36

C#序列化和反序列化
點(diǎn)贊
收藏

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

国产小视频国产精品| 岛国av在线一区| 中文字幕av一区中文字幕天堂| www.超碰97.com| 欧美xxxx少妇| 国产亚洲综合色| 亚洲综合成人婷婷小说| 天天操天天摸天天干| 99欧美视频| 日韩大陆欧美高清视频区| 日韩欧美国产片| 深夜成人在线| 亚洲精品国产成人久久av盗摄 | 欧美综合影院| 欧美日韩国产激情| 最新视频 - x88av| 韩国三级在线观看久| 国产精品18久久久| 国产精品一区二区久久久| 日韩精品一卡二卡| 亚洲91久久| 伊人伊成久久人综合网小说| 欧美大喷水吹潮合集在线观看| 黄色精品视频网站| 色天使久久综合网天天| 男女啪啪免费视频网站| a视频在线播放| 中文字幕精品在线不卡| 久久国产精品 国产精品| www.爱爱.com| 激情成人午夜视频| 国产精品亚洲欧美导航| 久久久久久在线观看| 影音先锋日韩资源| 久久99热精品这里久久精品| 久久免费手机视频| 怕怕欧美视频免费大全| 日韩精品在线免费| 99re久久精品国产| 国产91精品入| 精品人伦一区二区色婷婷| 亚洲精品中文字幕乱码无线| 日韩毛片网站| 欧美日本在线看| 一区二区三区 日韩| 欧美大片免费高清观看| 色欧美片视频在线观看 | 久久激情五月婷婷| 国产精品久久久久久久app| 午夜视频网站在线观看| 日韩电影在线一区二区| 国产不卡在线观看| 无码人妻丰满熟妇精品区| 久久婷婷丁香| 国产精品成av人在线视午夜片| 亚洲天堂视频网站| 美女精品在线观看| 国产成人亚洲综合青青| 91porny九色| 麻豆国产精品777777在线| 国产精品偷伦免费视频观看的| 特级西西444www大胆免费看| 美腿丝袜亚洲综合| 国产精品成久久久久| 欧美精品日日鲁夜夜添| 日本高清免费在线视频| 亚洲国产欧美国产第一区| 欧美成人性福生活免费看| 扒开伸进免费视频| 亚洲黄页在线观看| 这里只有精品在线播放| 亚洲精品天堂网| 午夜激情一区| 国语自产在线不卡| 无码人妻一区二区三区线| 美女一区二区久久| 成人永久免费| 免费观看成年在线视频网站| 国产精品国产三级国产aⅴ无密码| 影音欧美亚洲| av在线加勒比| 在线观看一区日韩| 国产人妻精品久久久久野外| 日韩av系列| 最近2019中文字幕在线高清| 欧美日韩三级在线观看| 麻豆亚洲精品| 96成人在线视频| 三级在线观看| 综合av第一页| 国产女大学生av| 成人在线免费电影网站| 日韩欧美一区电影| 国产成人福利在线| 欧美久久一级| 国产精品久久久久77777| 丁香花免费高清完整在线播放 | 扒开jk护士狂揉免费| 无需播放器亚洲| 97超级碰碰碰| 国产视频一二三四区| 2014亚洲片线观看视频免费| 日本亚洲最大的色成网站www| 国产欧美精品一区二区三区介绍| 亚洲国产www| 欧美国产乱子伦 | 国产jjizz一区二区三区视频| 午夜精品毛片| 国产91精品最新在线播放| 国产高中女学生第一次| 国产欧美综合色| 欧美成人精品免费| 日韩城人网站| 亚洲全黄一级网站| 九九热国产视频| 狠狠久久亚洲欧美| 日韩欧美亚洲v片| sm在线观看| 日韩一区二区精品在线观看| 亚洲精品国产精品国自产网站| 国产成人精品免费视| 午夜精品99久久免费| 国产免费不卡视频| 中文字幕二三区不卡| 欧美污视频网站| 欧美一区二区三区红桃小说| 欧美激情精品久久久久久蜜臀| 国产乱码精品一区二三区蜜臂| 国产欧美日韩精品在线| 欧美黄网站在线观看| 精品av导航| 欧美激情欧美狂野欧美精品| av网站在线观看免费| 一区在线观看视频| 中文字幕22页| 欧美电影免费| 国产精品一区二区久久久久| 91在线播放网站| 欧美日韩日本视频| 国产不卡在线观看视频| 麻豆成人91精品二区三区| 日本一区免费在线观看| 女生影院久久| 亚洲欧洲国产伦综合| 天干夜夜爽爽日日日日| 久久亚区不卡日本| 黄色片一级视频| 亚洲精品国产精品粉嫩| 日韩女在线观看| 福利视频在线看| 欧美日韩一区 二区 三区 久久精品| 韩国三级hd中文字幕| 日本伊人午夜精品| 一区二区三区在线视频看| 国产精品亚洲成在人线| 日韩中文字幕在线播放| a天堂视频在线| 亚洲国产日韩一级| 中文字幕日韩三级片| 丝袜亚洲另类欧美| 欧美日本免费一区二区三区| 日韩av一二三四区| 蜜臀91精品国产高清在线观看| 国产成人精品一区二区三区| av亚洲在线| 91精品国产综合久久久蜜臀粉嫩| 精品一区在线观看视频| bt欧美亚洲午夜电影天堂| 久久精品免费一区二区| 精品国产一区二区三区小蝌蚪 | 老司机在线视频二区| 99精品视频中文字幕| 成人一对一视频| 国产成人精品一区二区免费看京| 国产精品吊钟奶在线| 美女黄视频在线观看| 日韩一区二区三区四区| 日韩欧美三级视频| 中文字幕第一区二区| 欧美体内she精高潮| 亚洲欧美视频一区二区三区| 中文字幕成人一区| 六月丁香久久丫| 国产欧美日韩中文字幕| 电影k8一区二区三区久久| 亚洲欧美日韩一区在线| 国产精品一级二级| 欧美日韩国产一区中文午夜| 婷婷丁香综合网| 成人av免费观看| 天天爽夜夜爽一区二区三区| 伊人成人在线视频| 婷婷久久伊人| 999国产精品一区| 国产精品96久久久久久| 新版中文在线官网| 在线国产精品播放| 秋霞网一区二区| 欧美日韩视频专区在线播放| 日本一区二区网站| 中文字幕一区二区三区四区不卡| 大尺度做爰床戏呻吟舒畅| 麻豆91在线播放| 97视频在线免费播放| 国产精品videosex极品| 亚洲午夜久久久影院伊人| 青青草这里只有精品| 亚洲mm色国产网站| 成人在线高清| 国产成人亚洲精品| f2c人成在线观看免费视频| 精品精品国产国产自在线| 国产在线网站| 亚洲国产91精品在线观看| 国产精品无码久久久久成人app| 日本电影亚洲天堂一区| 日韩成人高清视频| 一区二区三区四区视频精品免费| 毛片久久久久久| 久久久精品日韩欧美| 中文字幕免费在线播放| 成人三级伦理片| 久久久久无码精品| 久久福利资源站| 欧美午夜性生活| 免费日韩av片| 日韩在线综合网| 亚洲精品少妇| 人人妻人人澡人人爽欧美一区| 91亚洲国产高清| 亚洲精品电影在线一区| 国产真实有声精品录音| 欧美一区二区三区在线播放| 欧美日韩一区二区三区在线电影| 粉嫩av免费一区二区三区| 国产一区二区三区国产精品| 91精品久久久久久久久久久久久久 | 奇米一区二区| 亚洲va久久久噜噜噜久久天堂| 欧美激情福利| 成人av色在线观看| 国产电影一区二区| 2014亚洲精品| 欧美日韩黄网站| 99蜜桃在线观看免费视频网站| 99久久99九九99九九九| 亚洲va男人天堂| 欧美专区一区| 国产欧美一区二区在线播放| 国产精品chinese在线观看| 国产视频精品网| 任我爽精品视频在线播放| 欧美视频1区| 精品国产一区探花在线观看| 性欧美videosex高清少妇| 色狮一区二区三区四区视频| 日本黄色播放器| 欧美激情第8页| 日韩精品 欧美| 日韩主播视频在线| 一区二区三区.www| 亚洲区自拍偷拍| 国产精品网曝门| 国产va在线播放| 亚洲成人久久影院| 亚洲欧美偷拍一区| 欧美喷潮久久久xxxxx| 精品人妻午夜一区二区三区四区| 精品日韩一区二区| 猫咪在线永久网站| 色噜噜狠狠色综合网图区| 日本乱理伦在线| 秋霞av国产精品一区| 成人免费黄色| 亚洲伊人久久综合| 欧美五码在线| 9999在线观看| 9色精品在线| 亚洲一区二区三区四区五区| 国产a精品视频| 这里只有久久精品| 亚洲欧美日韩中文播放| 国产一级做a爱片久久毛片a| 欧美日韩在线三区| 欧美一级做性受免费大片免费| 亚洲片国产一区一级在线观看| 麻豆视频在线观看免费| 午夜精品久久久久久久久久久久久| 日韩成人高清| 91久久久一线二线三线品牌| 亚洲传媒在线| 中国女人做爰视频| 日韩高清欧美激情| 在线免费播放av| 亚洲天堂成人在线观看| 好看的av在线| 日韩欧美123| 自拍视频在线免费观看| 久久免费少妇高潮久久精品99| 黄色欧美视频| 久久综合入口| 欧美理论在线| 毛片毛片毛片毛| 久久久精品tv| 欧美一区二区三区精品电影| 性欧美又大又长又硬| 97久久天天综合色天天综合色hd| 欧美日韩国产一区二区三区不卡| 免费高清一区二区三区| 久久国产日韩欧美精品| 波多野结衣a v在线| 亚洲激情男女视频| 亚洲香蕉在线视频| 亚洲精品一区二区在线| 欧美1—12sexvideos| 91久久国产精品91久久性色| 精品国产欧美日韩| 777久久久精品一区二区三区| 国产成人自拍高清视频在线免费播放| 国产aaaaaaaaa| 日本韩国欧美一区| 日本护士...精品国| 97色在线观看| 成人偷拍自拍| 小泽玛利亚av在线| 精品一区二区三区av| 怡红院一区二区三区| 91黄色激情网站| 日韩成人黄色| 97视频国产在线| 日韩福利视频一区| 男女激情无遮挡| 成人黄页在线观看| 日本一区二区免费在线观看| 精品国偷自产国产一区| 日本在线观看高清完整版| 91丝袜美腿美女视频网站| 91tv官网精品成人亚洲| 中文字幕亚洲乱码| 国产精品久久国产精麻豆99网站| 波多野结衣家庭主妇| 国产一区二区三区毛片| 美女网站视频一区| 日韩av大全| 美女视频黄频大全不卡视频在线播放| 性欧美精品男男| 欧美欧美欧美欧美首页| 日韩在线观看www| 91九色单男在线观看| 欧美xxx在线观看| 久久久久无码国产精品一区李宗瑞| 亚洲综合色成人| 水中色av综合| 国产精品678| 午夜片欧美伦| 在线xxxxx| 日韩欧美成人免费视频| 成黄免费在线| 国产综合在线观看视频| 欧美激情第8页| 91精品小视频| 在线免费不卡视频| 免费大片在线观看www| 99久久无色码| 亚洲一区二区三区高清不卡| 91激情视频在线观看| 欧美福利一区二区| 1234区中文字幕在线观看| 欧美日韩国产免费一区二区三区| 蜜臂av日日欢夜夜爽一区| 久久久精品视频免费观看| 亚洲国产一区二区三区四区| 日韩av大片站长工具| 正在播放久久| 99久久免费精品高清特色大片| 免费av中文字幕| 欧美精品在线观看91| 先锋影音国产精品| 99re精彩视频| 亚洲高清视频在线| 国产精品毛片一区二区三区四区| 亚洲一区二区在线| 国产深夜精品| 91成人福利视频| 亚洲人成啪啪网站| 国内精品视频| 日韩网址在线观看| 亚洲欧美电影一区二区| 亚洲av片在线观看| 91色琪琪电影亚洲精品久久| 久久精品午夜| 久久久久成人网站| 在线日韩第一页| 9l亚洲国产成人精品一区二三| 亚洲少妇第一页| 亚洲第一福利视频在线| 日本高清在线观看wwwww色| 久久99导航| 懂色av中文字幕一区二区三区| 中文字幕一级片|