分布式系列三: 对象序列化
序列化可以解决分布式系统节点间复杂对象传输的问题. 将对象状态转化为可存储或可传输的过程叫序列化, 而反序列化是将其还原成对象的过程.
几种序列化机制
JDK的序列化
Java默认的序列化要求实现Serializable
接口.
缺点:
- 序列化的结果比较大, 占用字节多, 传输效率低
- 仅Java实现, 不能跨语言
WebService
基于XML格式的传输.
Json方式
缺点:
- 结果依然较大
- 性能低
二进制传输
MessagePack
Protocal Buffer
Java的默认方式
// 使用了lombok @Data @AllArgsConstructor @NoArgsConstructor public class Car implements Serializable{ // 版本号, java通过此版本号是否一致判断是否可以执行反序列化 // 名称的数据类型必须准确,否则只是相当于定义一个普通的静态变量 public static long serialVersionUID = -1244L; // 静态变量不序列化 public static int age = 10; // 用protobuffer的话, 需要field上加Protobuffer的注解 @Protobuf(fieldType = FieldType.INT32,order = 1) private int wheels; @Protobuf(fieldType = FieldType.STRING,order = 2) private String name; // 瞬时变量, 不被序列化 private transient String desc; public static void main(String[] args) throws IOException, ClassNotFoundException { //serializeCar(); Car car = deSerializeCar(); System.out.println(car.age); System.out.println(car.toString()); } private static void serializeCar() throws IOException { ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("car"))); Car car = new Car(4, "BMW", "fast...."); objectOutputStream.writeObject(car); car.age = 12; objectOutputStream.close(); } private static Car deSerializeCar() throws IOException, ClassNotFoundException { ObjectInputStream objectInputStream; objectInputStream = new ObjectInputStream(new FileInputStream(new File("car"))); Car car = (Car) objectInputStream.readObject(); return car; } }
-
static final long serialVersionUID = -124L;
序列化版本号, 一致的版本才可以反序列化 - 静态变量不参与序列化
-
transient
修饰的变量不序列化 - 父类实现序列化接口,子类会继承; 子类实现但父类不实现, 则父类的字段不被序列化(代码略)
- 序列化对象的存储: 同一对象的序列化,第二次将只存储第一个的引用及变化的部分,这样可以节省空间(代码略)
- 实现深克隆, 参看设计模式五: 原型模式(Prototype)
常用序列化协议
- Json: Json是比较流行的序列化机制, Spring 默认的json序列化是使用Jackson, 阿里的FastJson效率更高且更易于使用.
- Protobuffer: 二进制序列化有性能和传输方面的优势. 还有MessagePackage
- Hessian2, Dobbo使用此协议
- XML
- FST
// FastJson的序列化和反序列化 String strJson = JSON.toJSONString(object); Object object = JSON.parse(text); //Hessian的序列化 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); Hessian2Output hessian2Output = new Hessian2Output(byteArrayOutputStream); hessian2Output.writeObject(object); //Protobuffer的序列化 Codec<Car> carCodec = ProtobufProxy.create(Car.class, false); byte[] bytes = carCodec.encode(object);
序列化需要引用相关的包, 下面列出几个.
<!--jackson的序列化包--> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency> <!--fastjson的序列化包--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.49</version> </dependency> <!--Protobuffer的序列化包,由百度封装,增加了易用性--> <dependency> <groupId>com.baidu</groupId> <artifactId>jprotobuf</artifactId> <version>2.2.5</version> </dependency> <!--hessian的序列化包--> <dependency> <groupId>com.caucho</groupId> <artifactId>hessian</artifactId> <version>4.0.51</version> </dependency>
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
前端性能优化的方法
一、浏览器访问优化 浏览器请求处理流程图 1.减少http请求 http协议是无状态的用用层协议,意味着每次http请求都需要建立通信链路、进行数据传输,而在服务器端,每个http都需要启动独立的线程去处理。这些通信和服务的开销都很昂贵,减少http请求的数目可有效提供访问性能。 1)合并css、合并javascript、合并图片。将浏览器一次访问需要的js和css合并成一个问价,这样浏览器就只需要一次请求。图片也可以合并,多张图片合并成一张,如果没涨图片都有不同的超链接,可通过css便宜响应鼠标点击操作,构造不同的url. 2)合理设置缓存。很少变化的图片资源可以直接通过HTTP Header中的Expires设置一个很长的过期头,变化不频繁而有可能会变的资源可以使用last-Modifed来做请求验证,尽可能的让资源能够在缓存中待的更久。 2、使用浏览器缓存 1)将更新频率比较低的css、javascript、logo、图标等静态资源文件缓存在浏览器中,避免频繁的http请求,通过设置http 头中cache-contol和expire属性,可设置浏览器缓存,缓存时间可以是数天们甚...
- 下一篇
vue.js前端实现excel表格导出和获取headers里的信息
前段时间写过一篇文章基于element实现后台管理系统,并提到excel表格导出功能,可能描述不是很详细,现在单独整理列出。 后端提供的接口: // 下载分拣列表 export function getAssormentExport(params) { return request({ url: '/manage/health/assorment/export?ids=' + params, responseType: 'arraybuffer', // 代表内存之中的一段二进制数据 必须加 method: 'get' }) } vue:点击按钮调用接口 <el-button type="primary" size="mini" @click="addexport()">导出选中</el-button> script: // 导出选中 addexport() { if (this.multipleSelection.length <= 0) { this.$message({ showClose: true, message: '未选中数据', type:...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程