LiteHttp 第四节:自定义DataParser和Json序列化库的替换
来源:互联网 发布:做表情包软件 编辑:程序博客网 时间:2024/05/22 13:58
官网: http://litesuits.com
QQ群: 大群 47357508,二群 42960650
本系列文章面向android开发者,展示开源网络通信框架LiteHttp的主要用法,并讲解其关键功能的运作原理,同时传达了一些框架作者在日常开发中的一些最佳实践和经验。
本系列文章目录总览: http://blog.csdn.net/ko33600/article/details/49367409
1. DataParser机制简介
DataParser即数据解析器,其作用是将网络流对象转换为指定的对象,包括将缓存的存储和读取,甚至Json对象的转化等作用。
lite-http内置五种形式的请求,也就有五种DataParser类型:
- StringRequest : 字符串请求,对应StringParser,将stream转为string。
- BytesRequest : 字节请求,对应BytesParser,将stream转为byte。
- JsonAbsRequest : Json对象请求,对应JsonParser,将stream转为Java Model。
- BitmapRequest : 位图加载请求,对应BitmapParser,将stream转为bitmap。
- FileRequest : 文件下载请求,对应FileParser,将stream转为file。
通过源码可以发现,他们的共同基类是DataParser,它有两个直接子类,将解析器分为两种:
- MemCacheableParser :解析并处理可支持闪存缓存的数据,包括:StringRequest,BytesRequest和JsonAbsRequest。
- FileCacheableParser :解析并处理仅支持文件缓存的数据,包括:BitmapRequest和FileRequest。
以上请求形式在实际应用中可能出现不能满足某些特定需求的情况,这时需要自定义DataParser来增强lite-http的数据处理能力。
2. 自定义DataParser实例
如果文件略大只能支持文件缓存,需要继承FileCacheableParser。
如果文件不大可以支持闪存缓存,则要继承MemCacheableParser。
举个例子,现在要将网络数据解析为JSONObject(android系统自带的org.json包里的JSONObject),我们首先可以确定返回JSONObject对象不会太大,可以支持闪存、文件两级缓存,代码如下:
/** * parse stream to JSONObject */ class CustomJSONParser extends MemCacheableParser<JSONObject> { String json; /** * 实现远程网络流解析 */ @Override protected JSONObject parseNetStream(InputStream stream, long totalLength, String charSet) throws IOException { return streamToJson(stream, totalLength, charSet); } /** * 实现本地文件流解析 */ @Override protected JSONObject parseDiskCache(InputStream stream, long length) throws IOException { return streamToJson(stream, length, charSet); } /** * 实现文件缓存 */ @Override protected boolean tryKeepToCache(JSONObject data) throws IOException { return keepToCache(json); } /** * 1. 将 stream 转换为 String * 2. String 转为 JSONObject */ protected JSONObject streamToJson(InputStream is, long length, String charSet) throws IOException { this.json = streamToString(is, length, charSet); try { return new JSONObject(json); } catch (JSONException e) { e.printStackTrace(); } return null; }}
使用方式:
JsonRequest<JSONObject> jsonRequest = new JsonRequest<JSONObject> (userUrl, JSONObject.class);jsonRequest.setDataParser(new CustomJSONParser());liteHttp.executeAsync(jsonRequest.setHttpListener(new HttpListener<JSONObject>() { @Override public void onSuccess(JSONObject jsonObject, Response<JSONObject> response) { }}));
3. Json序列化库的替换
Json序列化库比较出名的有fastjson,jackson,gson等,初学者往往不知道该选哪个,经过个人较大量的实践测试得出一些结论,仅供参考。
json的序列化及反序列化性能对比:
- fastjson 处理处理少量数据的对象时速度最快;
- jackson 在处理较大量数据的对象时速度最快;
- gson 速度不及前两者。
其他方面:
- fastjson需要getter方法,比较麻烦。
- jackson jar包体积太大,不合适移动端开发。
- gson 速度不是最快,但可以接受,包体积最小。
鉴于gson速度适中,API健全稳定,使用简单且包体积最小,lite-http默认使用gson作为json自动序列化及反序列化类库。
如果正在使用其他json自动化类库,当然也可以轻松替换
将gson替换为alibaba的fastjson类库:
// first, set new json framework instance. then, over.Json.set(new FastJson());
FastJson类如何实现?
class FastJson extends Json { @Override public String toJson(Object src) { return JSON.toJSONString(src); } @Override public <T> T toObject(String json, Class<T> claxx) { return JSON.parseObject(json, claxx); } @Override public <T> T toObject(String s, Type type) { return JSON.parseObject(s, type); } @Override public <T> T toObject(byte[] bytes, Class<T> claxx) { return JSON.parseObject(bytes, claxx); }}
像往常一样发送请求,json库就换为fastjson了:
// json model convert used #FastJsonliteHttp.executeAsync(new JsonAbsRequest<User>(userUrl) {}.setHttpListener(new HttpListener<User>() { @Override public void onSuccess(User user, Response<User> response) { response.printInfo(); }}));
- LiteHttp 第四节:自定义DataParser和Json序列化库的替换
- JSON的自定义序列化和解析
- LiteHttp 第七节:重试和重定向
- Json-lib 自定义序列化和反序列化
- 序列化和json
- 序列化和json
- LiteHttp 第二节:简化请求和非安全方法的使用
- json的解析和序列化
- php的serialize序列化和json
- python的序列化和json
- python Json的一点收获,自定义序列化方法
- python Json的一点收获,自定义序列化方法
- JSON 自定义序列化(过滤掉不想要的属性)
- LiteHttp 第五节:文件、位图的上传和下载
- json的序列化
- JSON序列化的注意(数组,字典,自定义对象的序列化)
- LiteHttp 第六节:禁用网络和流量&耗时统计
- Newtonsoft.Json 自定义序列化特性
- 剑指Offer--平衡二叉树
- Xcode上传App到Appstore时,报错Error ITMS-90049:"This bundle is invalid.The bundle...."
- Android数据通信--串口通信
- 查找子串的索引位置算法
- 背包DP-HDU-1114-Piggy-Bank
- LiteHttp 第四节:自定义DataParser和Json序列化库的替换
- 各个JSON技术的比较
- 如何获得mysql数据库的所有的列
- Qt C++制作贪吃蛇游戏(在Qt5.4.2可以正常运行)
- javascript入门基础(mooc笔记)
- Android开发中解决Toast长时间显示问题
- POJ1321(状压DP)
- nyoj 1的个数 514 (数学)
- Android 中的 Service 全面总结