最近在做原生Android应用,有一个功能是在APP中把需要的数据导出(放在sdcard上),然后在Web端将该文件上传管理。当时想到的解决方案有两个,一个是将对象序列化,另一个就是存成JSON格式。因为正好最近看到了序列化,就打算先试试序列化方案。大概序列化的方法可以参考下面链接:
https://www.cnblogs.com/xdp-gacl/p/3777987.html
文章写得比较详细,然后在本机上做了单元测试可以走通,周五的时候就提交代码美滋滋地回去了。
周一同事跟我反馈,在Web端进行文件的反序列化失败了,报错ClassNotFoundException ,原因是因为两个实体类的包路径不同。
这就超出我的知识范围了,赶紧回头找解决方案。
上网查了下,序列化和反序列化的时候有两个基本支撑点,即
1.包名相同
2.serialVersionUID。
因为APP和Web端分别是两个项目,不能让包名相同,上网找解决办法未果,只能改用转JSON的方式:
用的是jackson-mapper-1.9.5.jar这个包
MAPPER.writeValueAsString()方法直接将对象转成JSON,然后放到文件里。
在序列化的时候有个特殊类型的字段(Geometry),直接将其序列化并不会生成自己想要的东西,所以这里做了一部处理,先将其转成String类型再放到文件里:
用的包是arcgis-android-api.jar
String fg = GeometryEngine.geometryToJson(SpatialReference.create(SpatialReference.WKID_WGS84), result.getFeatureGeometry());
反序列化时,有个字段是byte字段需要做特殊处理:
byte[] jsonToByte = java.util.Base64.getMimeDecoder().decode(byteString);
String url = new String(jsonToByte );
这里采用的是java工具包里的方法,如果你的项目引入了alibaba的包或Apache的包,里面也会有类似的功能。
至此,该功能算是能够交差了,算是给自己知识查缺补漏了。