当前位置: 首页 > news >正文

p2p商城网站建设方案北京企业官网建站

p2p商城网站建设方案,北京企业官网建站,网站搭建的人,给公司网站做seo序列化一个对象才是正经事 对象的序列化和反序列化是我们日常编码中一个非常基础的需求#xff0c;尤其是对一个对象的json encode/decode操作。每一个平台都会有相关的库来帮助开发者方便得进行这两个操作#xff0c;比如Java平台上赫赫有名的GSON#xff0c;阿里巴巴开源…序列化一个对象才是正经事 对象的序列化和反序列化是我们日常编码中一个非常基础的需求尤其是对一个对象的json encode/decode操作。每一个平台都会有相关的库来帮助开发者方便得进行这两个操作比如Java平台上赫赫有名的GSON阿里巴巴开源的fastJson等等。 而在flutter上借助官方提供的JsonCodec只能对primitive/Map/List这三种类型进行json的encode/decode操作对于复杂类型JsonCodec提供了receiver/toEncodable两个函数让使用者手动“打包”和“解包”。 显然JsonCodec提供的功能看起来相当的原始在闲鱼app中存在着大量复杂对象序列化需求如果使用这个类就会出现集体“带薪序列化”的盛况而且还无法保证正确性。 来自官方推荐 聪明如Google官方当然不会坐视不理。json_serializable的出现就是官方给出的推荐它借助Dart Build System中的build_runner和json_annotation库来自动生成fromJson/toJson函数内容。(关于使用build_runner生成代码的原理之前兴往同学的文章已经有所提及) 关于如何使用json_serializable网上已经有很多文章了这里只简单提一些步骤 Step 1 创建一个实体类Step 2 生成代码: 来让build runner生成序列化代码。运行完成后文件夹下会出现一个xxx.g.dart文件这个文件就是生成后的文件。 Step 3 代理实现: 把fromJson和toJson操作代理给上面生成出来的类 我们为什么不用这个实现 json_serializable完美实现了需求但它也有不满足需求的一面: 使用起来有些繁琐多引入了一个类很重要的一点是大量的使用as会给性能和最终产物大小产生不小的影响。实际上闲鱼内部的《flutter编码规范》中是不建议使用as的。(对包大小的影响可以参见三笠同学的文章同时dart linter也对as的性能影响有所描述) 一种正经的方式 基于上面的分析很明显的需要一种新的方式来解决我们面临的问题我们暂且叫它fish-serializable 需要实现的功能 我们首先来梳理一下一个序列化库需要用到 获取可序列化对象的所有field以及它们的类型信息能够构造出一个可序列化对象并对它里面的fields赋值且类型正确支持自定义类型最好能够解决泛型的问题这会让使用更加方便最好能够轻松得在不同的序列化/反序列化方式中切换例如json和protobuf。 困难在哪里 flutter禁用了dart:mirrors反射API无法使用也就无法通过反射的方式new一个instance、扫描class的fields。泛型的问题由于dart不进行类型擦出可以获取但泛型嵌套后依然无法解开。 Lets rock 无法使用dart:mirrors是个“硬”问题没有反射的支持类的内容就是一个黑盒。于是我们在迈出第一步的时候就卡壳了- -! 这个时候笔者脑子里闪过了很多画面白驹过隙乌飞兔走啊不是...是cc作为一种无法使用反射的语言它是如何实现对象的 序列化/反序列化 操作的呢 一顿搜索猛如虎之后发现大神们使用创建类对象的回调函数配合宏的方式来实现c中类似反射这样的操作。 这个时候笔者又想到了曾经朝夕相处的Android(现在已经变成了flutter)Android中的Parcelable序列化协议就是一个很好的参照它通过writeXXXAPIs将类的数据写入一个中间存储进行序列化再通过readXXXAPIs进行反序列化这就解决了我们上面提到的第一个问题既如何将一个类的“黑盒子”打开。 同时Parcelable协议中还需要使用者提供一个叫做CREATOR的静态内部类用来在反序列化的时候反射创建一个该类的对象或对象数组对于没有反射可用的我们来说用c的那种回调函数的方式就可以完美解决反序列化中对象创建的问题。 于是最终我们的基本设计就是 ValueHolder 这是一个数据中转存储的基类它内部的writeXXX APIs提供展开类内部的fields的能力而readXXX则 用来将ValueHolder中的内容读取赋值给类的fields。readList/readMap/readSerializable函数中的type argument我们把它作为外部想要解释数据的 方式比如readSerializableT(key: object)表示外部想要把key为object的值解释为T类 型。 FishSerializable FishSerializable是一个interfacecreator是个一个get函数用来返回一个“创建类对象的回调” writeTo函数则用来在反序列化的时候放置ValueHoder-fields的代码。 JsonSerializer 它继承于FishSerializer接口实现了encode/decode函数并额外提供encodeToMap和 decodeFromMap功能。JsonSerializer类似JsonCodec直接面向使用者用来json encode/decode 以上我们已经基本做好了一个flutter上支持对象序列化/反序列化操作的库的基本架构设计对象的序列化过程可以简化为: 由于ValueHolder中间存储的存在我们可以很方便得切换 序列化/反序列器比如现有的JsonSerializer用来实现json的encode/decode如果有类似protobuf的需求我们则可以使用ProtoBufSerializer来将ValueHolder中的内容转换成我们需要的格式。 困难是不存在的 有了基本的结构设计之后实现的过程并非一帆风顺。 如何匹配类型? 为了能支持泛型容器的解析我们需要类似下面这样的逻辑 ListSerializableObject list holder.readListSerializableObject(key: list);ListE readListE({String key}){Listdynamic list _read(key); }E _flattenListE(Listdynamic list){list?.mapE((dynamic item){// 比较E是否属于某个类型然后进行对应类型的转换 }); } 在Java中可以使用Class#isAssignableFrom而在flutter中我们没有发现类似功能的API提供。而且如果做下面这个测试你还会发现一些很有意思的细节 void main() {print(int test);testint(1);print(\r\nint list test);testListint(int[]);print(\r\nobject test);testAint(Aint()); }void testT(T t){print(T);print(t.runtimeType);print(T t.runtimeType);print(identical(T, t.runtimeType)); }class AT{} 输出的结果是 可以看到对于List这样的容器类型函数的type argument与instance的runtimeType无法比较当然如果使用t is T是可以返回正确的值的但需要构造大量的对象。所以基本上我们无法进行类型匹配然后做类型转换。 如何解析泛型嵌套? 接下去就是如何分解泛型容器嵌套的问题考虑如下场景 MapString, Listint listMap;listMap holder.readMapString, Listint(key: listMap); readMap中得到的value type是一个Listint而我们没有API去切割这个type argument。 所以我们采用了一种比较“笨”也相对实用的方式。我们使用字符串切割了type argument比如 Listint String[Listint, List, int] 然后在内部展开List或Map的时候使用字符串匹配的方式匹配类型在目前的使用中完美得支持了标准List和Map容器互相嵌套。但目前无法支持标准List和Map之外的其他容器类型。 Whats more IDE插件辅助 写过Android的Parcelable的同学应该有种很深刻的体会Parcelable协议中有大量的“机械”代码需要写类似设计的fish-serializable也一样。 为了不被老板和使用库的同学打死同时开发了fish-serializable-intelij-plugin来自动生成这些“机械”代码。 与json_serializable的对比 fish-serializable在使用上配合IDE插件减少了大量的as操作符的使用同时在步骤上也更加简短方便。相比于json_annotation生成的代码fish-serializable生成的代码也更具可读性方便手动修改一些代码实现。fish-serializable可以通过手动接管 序列化/反序列化 过程的方式完美兼容json_annotation等其他方案。 目前闲鱼app中已经开始大量使用。 开源计划 fish-serializable和fish-serializable-intelij-plugin都在开源计划中相信不久就可以与大家见面尽请期待~ 原文链接 本文为云栖社区原创内容未经允许不得转载。
http://www.yutouwan.com/news/305871/

相关文章:

  • 唐山网站建设价格wordpress主题更换备份
  • 货架网站开发网站开发 平均工资
  • 个人什么取消网站备案将网站的字体设计成百分比的形式要怎样定义
  • 江西有色建设集团公司 网站室内设计案例分析图文
  • 网站建设攻略北京软件开发外包公司
  • 怎么做网站用于推广建设企业展示网站
  • 如何提升进入网站的速度顺企网官网企业名录
  • 建设网站怎么收费标准深圳最新动态实时更新
  • 做推广的公司义乌网站优化建设
  • 网站备案购买高校学生红色网站建设
  • 报考大专网站肇庆wordpress后台文章自定义字段面板
  • 网站开发课程技术培训宜春做网站
  • 网站 域名绑定国外互动网站
  • 网站绑定两个域名怎么做跳转爬虫 网站开发实例
  • 制作手机端网站办公室现代简约装修效果图
  • 成都网站建设 创新互联discuz绿色带门户手机网站模板
  • 如何做好企业网站win主机wordpress
  • 四川住房和城乡建设部网站官网不同网站建设特点
  • 合肥专业网站建设公司哪家好做做网站下载免费
  • 阿里云win服务器怎么做网站珠海响应式网站建设费用
  • 企业网站建站那种好内蒙古知名网站建设
  • 网站分页符怎么做安徽住房和城乡建设厅注册网站
  • 网站安全狗卸载卸载不掉人和动物做的电影网站
  • 深圳建设网站培训机构wordpress 左右黑白
  • 设计学校网站模板晨星wordpress 主题
  • 网站用户体验度福州网站建设营销方案
  • 网站动态模板网站建设公司哪个好
  • 怎么做视频网站教程iis 设置网站权限
  • wordpress 英文 企业网站模板网站域名备案需要多长时间
  • 网站信息资源建设国外最具创意的wordpress博客