xson 1.0.2 发布,新增byte[] buffer,支持XCO
为什么80%的码农都做不了架构师?>>>
1. 项目介绍
Xson是一个Java对象序列化和反序列化框架。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。
官网地址:http://xson.org
项目地址:https://git.oschina.net/xsonorg/xson
2. 新版本特性
- 新增
buffer
包,此包中的相关类提供对序列化过程中的byte[]进行分配、使用、回收的管理;进一步提供序列化的速度,并减少Full GC。 - 提供带有偏移内容的API支持;
- 提供XCO对象序列化和反序列的支持;
- 提供扩展配置文件的支持;
3. 使用教程
3.1 基本使用
a. 添加依赖
<dependency><groupId>org.xson</groupId><artifactId>xson</artifactId><version>1.0.2</version>
</dependency>
b. 序列化
User user = new User();
// set...
byte[] data = XSON.encode(user);
c. 反序列化
// byte[] data
User user = XSON.decode(data);
d. 带有偏移内容的序列化和反序列化
int x = 6;User user = new User();
// set...
byte[] data = XSON.encode(x, user);// byte[] data
User user = XSON.decode(x, data);
3.2 配置文件
1.xson.properties文件配置示例:
# Support for XCO
xco=true# ByteArrayManager configuration
byteArray.number=100
byteArray.capacity=512# User classname mapping configuration
java.util.ArrayList=0
java.util.EnumSet=1
java.util.HashSet=2
java.util.LinkedHashSet=3
java.util.LinkedList=4
java.util.Stack=5
java.util.TreeSet=6
java.util.Vector=7
java.util.EnumMap=8
java.util.HashMap=9
java.util.Hashtable=a
java.util.IdentityHashMap=b
java.util.LinkedHashMap=c
java.util.Properties=d
java.util.TreeMap=e
java.util.concurrent.ConcurrentHashMap=f
2.配置说明
xco=true
开启对XCO对象的支持,默认不开启;
byteArray.number
ByteArrayManager管理的byte[]数量,默认100;
byteArray.capacity
ByteArrayManager管理的每个byte[]的容量,默认512;
java.util.ArrayList=0
用户类名自定义映射;比如:当XSON序列化的User对象时,序列化结果的类信息描述区中会记录User类的全类名,如org.xson.User,如果我们通过此处配置org.xson.User=user
,那么类信息描述区中将只记录user
,此处配置可缩小序列化后数据的体积;
注意 配置文件使用固定名称xson.properties
,使用时请放入classpath根路径下。
3.3 自定义序列化处理器
1.用户自定义Serializer和Deserializer
public class CustomerSerializer implements XsonWriter {[@Override](https://my.oschina.net/u/1162528)public void write(Object target, ByteModel model) {// Implementation code}
}public class CustomerDeserializer implements XsonReader {[@Override](https://my.oschina.net/u/1162528)public Object read(ReaderModel model) {// Implementation codereturn null;}
}
2.添加用户自定义的Serializer和Deserializer
XsonSupport.addCustomSerializer(User.class, new CustomerSerializer(), new CustomerDeserializer());
注意: Serializer和Deserializer必须成对设置.
4. 技术设计
4.1 类图设计
- XSON:用户入口类,提供序列化和反序列化方法;
- WriterModel:序列化写入模型类;
- XsonWriter:序列化接口;
- ArraySerializer:对象数组序列化类;
- CollectionSerializer:集合对象序列化类;
- EnumSerializer:枚举对象序列化类;
- MapSerializer:Map对象序列化类;
- Other Serializer:其他类型对象序列化类,详见源码;
- ReaderModel:反序列化读取模型类;
- XsonReader:反序列化接口;
- CurrencyDeserializer:货币对象反列化类;
- DateUtilDeserializer:时间对象反列化类;
- LocaleDeserializer:地区对象反列化类;
- LongDeserializer:Long包装对象反列化类;
- Other Deserializer:其他类型对象反列化类,详见源码;
- XsonConst:常量类,持有所有的序列化类和反序列化类实例;
4.2 byte[]管理
- 浅绿色:
byte[]
,由ByteArrayManager
类进行管理,在其内部持有多个byte[]
,容量均一致;在序列化过程中ByteArrayManager
提供byte[]
的申请和回收管理; - 深绿色:
byte[]
,序列化过程中临时创建的,不受ByteArrayManager
管理,使用后由GC处理; - 淡蓝色:
ByteArrayItem
类;基于byte[]
的封装类,其内容记录byte[]
的capacity
、limit
等使用属性; - 黄色:
XSONByteArray
类;内部持有一个或者多个ByteArrayItem
类,通过此类可将基本类型、字符串、字节数组序列化到ByteArrayItem
类所封装的byte[]
中;
4.3 ASM技术使用
对于Java Bean对象的处理,XSON框架使用ASM技术,动态的为每个Bean对象生成相应的Serializer和Deserializer,用于序列化和反序列化。
5. 数据结构
XSON数据结构说明
1. 标记说明
- [*] 可选部分
- (*) 必有部分
2. 整体结构
格式:[E](H)(D)[C][L]
- E:偏移内容区
- H:Head标记;1 byte长度,取值如下:
- 0x01:无[C][L]部分
- 0x02:有[C][L]部分
- D:对象序列化后的字节数据;
- C:类信息描述区;
- L:类信息描述区长度,固定4 byte长度;
3. 类信息描述区{#class_desc}
格式:((H)(D))+
- H:类型标记;1 byte长度,取值如下:
- 0x01:后续的类名内容使用约定的类名映射
- 0x02:后续的类名内容使用完整的类名描述
- D:类名内容,参考String类型;
4. 对象引用{#ref}
格式:(H)(D)
- H:类型标记;1 byte长度,取值如下:
- 0xFD:引用对象的索引是一个完整的int类型,参考基本类型-int;
- 0xFE:后续1 byte长度表示引用对象的索引;
- D:引用对象的索引,长度由类型标记而定;
5. 基本类型-byte
格式:(H)(D)
- H:类型标记;1 byte长度,取值如下:
- 0x01:标记是byte类型
- D:byte类型数据的内容;
6. 基本类型-boolean
格式:(H)(D)
- H:类型标记;1 byte长度,取值如下:
- 0x02:标记是boolean类型
- D:boolean类型数据的字节内容,值固定如下:
- 0x01:true
- 0x00:false
7. 基本类型-short
格式:(H)(D)
- H:类型标记;1 byte长度,取值如下:
- 0x03:标记是short类型,后续2 byte长度表示一个short类型数据;
- 0x04:标记是short类型,后续1 byte长度表示一个short类型数据;
- D:short类型数据的字节内容;
8. 基本类型-char
格式:(H)(D)
- H:类型标记;1 byte长度,取值如下:
- 0x05:标记是char类型,后续2 byte长度表示一个char类型数据;
- 0x06:标记是char类型,后续1 byte长度表示一个char类型数据;
- D:char类型数据的字节内容;
9. 基本类型-int{#int}
格式:(H)(D)
- H:类型标记;1 byte长度,取值如下:
- 0x07:标记是int类型,后续4 byte长度表示一个int类型数据;
- 0x08:标记是int类型,后续1 byte长度表示一个int类型数据;
- 0x09:标记是int类型,后续2 byte长度表示一个int类型数据;
- 0x0A:标记是int类型,后续3 byte长度表示一个int类型数据;
- D:int类型数据的字节内容;
10. 基本类型-long{#long}
格式:(H)(D)
- H:类型标记;1 byte长度,取值如下:
- 0x0B:标记是long类型,后续8 byte长度表示一个long类型数据;
- 0x0C:标记是long类型,后续1 byte长度表示一个long类型数据;
- 0x0D:标记是long类型,后续2 byte长度表示一个long类型数据;
- 0x0E:标记是long类型,后续3 byte长度表示一个long类型数据;
- 0x0F:标记是long类型,后续4 byte长度表示一个long类型数据;
- 0x10:标记是long类型,后续5 byte长度表示一个long类型数据;
- 0x11:标记是long类型,后续6 byte长度表示一个long类型数据;
- 0x12:标记是long类型,后续7 byte长度表示一个long类型数据;
- D:long类型数据的字节内容;
11. 基本类型-float
格式:(H)(D)
- H:类型标记;1 byte长度,取值如下:
- 0x13:标记是float类型,后续4 byte长度表示一个float类型数据;
- 0x14:标记是float类型,后续1 byte长度表示一个float类型数据;
- 0x15:标记是float类型,后续2 byte长度表示一个float类型数据;
- 0x16:标记是float类型,后续3 byte长度表示一个float类型数据;
- D:float类型数据的字节内容;
12. 基本类型-double
格式:(H)(D)
- H:类型标记;1 byte长度,取值如下:
- 0x17:标记是double类型,后续8 byte长度表示一个double类型数据;
- 0x18:标记是double类型,后续1 byte长度表示一个double类型数据;
- 0x19:标记是double类型,后续2 byte长度表示一个double类型数据;
- 0x1A:标记是double类型,后续3 byte长度表示一个double类型数据;
- 0x1B:标记是double类型,后续4 byte长度表示一个double类型数据;
- 0x1C:标记是double类型,后续5 byte长度表示一个double类型数据;
- 0x1D:标记是double类型,后续6 byte长度表示一个double类型数据;
- 0x1E:标记是double类型,后续7 byte长度表示一个double类型数据;
- D:double类型数据的字节内容;
13. 基本类型的包装类
包装类的结构格式同基本类型相同,只是类型标记不同,取值如下:
包装类型标记 = 基本类型标记 | 0x40
14. String类型{#string}
格式:(H)(L)(D)
- H:类型标记;1 byte长度,取值如下:
- 0x1F:标记是String类型,后续4 byte长度表示长度;
- 0x21:标记是String类型,后续1 byte长度表示长度;
- 0x22:标记是String类型,后续2 byte长度表示长度;
- 0x23:标记是String类型,后续3 byte长度表示长度;
- L:长度;String的长度;
- D:String类型数据的字节内容;
15. 用户对象{#用户对象}
用户对象包括Java Bean、Map、List、Enum等。
格式:(H)(I)(D)
- H:类型标记;取值如下:
- 0xF5:类型索引是一个完整的int类型,参考基本类型-int;
- 0xF6:后续1 byte长度表示类型索引;
- I:类型索引;类信息描述区中类名的索引,参考类信息描述区,长度视类型标记而定:
- D:用户对象的字节内容;
16. 用户对象数组
格式:(H)(I)(AD)(L)(D)
- H:类型标记;取值如下:
- 0xF7:标记是用户对象数组,数组的长度是一个完整的int类型,参考基本类型-int;
- 0xF8:标记是用户对象数组,数组的长度是1 byte长度的int类型;
- I:类型索引;数组元素的类型索引;位于类信息描述区中类名的索引,参考类信息描述区,该索引是一个完整的int类型,参考基本类型-int;
- AD:数组维度,长度是1 byte长度的int类型;
- L:数组长度;长度视类型标记而定;
- D:用户对象数组的字节内容;
17. 系统对象数组
系统对象是包括基本类型和除了用户对象以为的对象。
格式:(H)(AT)(AD)(L)(D)
- H:类型标记;取值如下:
- 0xF9:标记是系统对象数组,数组的长度是一个完整的int类型,参考基本类型-int;
- 0xFA:标记是系统对象数组,数组的长度是1 byte长度的int类型;
- 0xFB:标记是系统对象数组,数组的长度是2 byte长度的int类型;
- AT:元素类型;数组元素的类型标记;该标记是一个1 byte长度的byte数据;
- AD:数组维度,长度是1 byte长度的int类型;
- L:数组长度;长度视类型标记而定;
- D:系统对象数组的字节内容;
18. java.util.Date
格式:(H)(D)
- H:类型标记;取值如下:
- 0x30:标记是java.util.Date类型;
- D:java.util.Date对象表示的毫秒数;是一个完整的long类型数据,参考基本类型-long;
19. java.sql.Date
格式:(H)(D)
- H:类型标记;取值如下:
- 0x31:标记是java.sql.Date类型;
- D:java.sql.Date对象表示的毫秒数;是一个完整的long类型数据,参考基本类型-long;
20. java.sql.Time
格式:(H)(D)
- H:类型标记;取值如下:
- 0x32:标记是java.sql.Time类型;
- D:java.sql.Time对象表示的毫秒数;是一个完整的long类型数据,参考基本类型-long;
21. java.sql.Timestamp
格式:(H)(D)
- H:类型标记;取值如下:
- 0x33:标记是java.sql.Timestamp类型;
- D:java.sql.Timestamp对象表示的毫秒数;是一个完整的long类型数据,参考基本类型-long;
22. BigInteger
格式:(H)(L)(D)
- H:类型标记;取值如下:
- 0x25:(L)是一个完整的int类型,参考基本类型-int;
- 0x26:后续1 byte长度表示(D)字节数组的长度;
- L:该对象的二进制补码表示形式的字节数组长度;(L)长度视类型标记而定;
- D:数组的字节内容;
23. BigDecimal
格式:(H)(S)(L)(D)
- H:类型标记;取值如下:
- 0x23:(S)(L)是一个完整的int类型,参考基本类型-int;
- 0x24:(S)(L)均为1 byte长度;
- S:标度;内容长度视类型标记而定;
- L:该对象的非标度值的BigInteger的二进制补码表示形式的字节数组长度;内容长度视类型标记而定;
- D:数组的字节内容;
24. StringBuilder
格式:(H)(D)
- H:类型标记;取值如下:
- 0x29:标记是java.lang.StringBuilder类型;
- D:String对象内容,参考String类型;
25. StringBuffer
格式:(H)(D)
- H:类型标记;取值如下:
- 0x28:标记是java.lang.StringBuffer类型;
- D:String对象内容,参考String类型;
26. Collection
格式:(H)(I)(D)*(END)
- H:类型标记;取值如下:
- 0xF5:类型索引是一个完整的int类型,参考基本类型-int;
- 0xF6:后续1 byte长度表示类型索引;
- I:类型索引;类信息描述区中类名的索引,参考类信息描述区,长度视类型标记而定:
- D:参考用户对象
- END:结束标记 0xF6;
27. Map
格式:(H)(I)((DK)(DV))*(END)
- H:类型标记;取值如下:
- 0xF5:类型索引是一个完整的int类型,参考基本类型-int;
- 0xF6:后续1 byte长度表示类型索引;
- I:类型索引;类信息描述区中类名的索引,参考类信息描述区,长度视类型标记而定:
- DK:key对象,参考用户对象
- DV:value对象,参考用户对象
- END:结束标记 0xF6;
28. Enum
格式:(H)(I)(D)
- H:类型标记;取值如下:
- 0xF5:类型索引是一个完整的int类型,参考基本类型-int;
- 0xF6:后续1 byte长度表示类型索引;
- I:类型索引;类信息描述区中类名的索引,参考类信息描述区,长度视类型标记而定:
- D:枚举常量的序数,参考基本类型-int;
29. URI
格式:(H)(D)
- H:类型标记;取值如下:
- 0x2A:标记是java.net.URI类型;
- D:URI对象的字符串表示形式;参考String类型;
30. URL
格式:(H)(D)
- H:类型标记;取值如下:
- 0x2B:标记是java.net.URL类型;
- D:URL对象的字符串表示形式;参考String类型;
31. UUID
格式:(H)(HD)(LD)
- H:类型标记;取值如下:
- 0x2C:标记是java.util.UUID类型;
- HD:此UUID对象128位值中的最高有效64位;基本类型-long;
- LD:此UUID对象128位值中的最低有效64位;基本类型-long;
32. Locale
格式:(H)(D)
- H:类型标记;取值如下:
- 0x2D:标记是java.util.Locale类型;
- D:使用由下划线分隔的语言、国家/地区和变量来获取整个语言环境的编程名称,String类型,参考String类型;
33. Currency
格式:(H)(D)
- H:类型标记;取值如下:
- 0x2E:标记是java.util.Currency类型;
- D:此货币的ISO 4217货币代码,String类型,参考String类型;
34. TimeZone
格式:(H)(D)
- H:类型标记;取值如下:
- 0x2F:标记是java.util.TimeZone类型;
- D:时区ID:String类型,参考String类型;
35. Inet4Address{#inet4}
- H:类型标记;取值如下:
- 0x35:标记是java.net.Inet4Address类型;
- D:此InetAddress对象的原始IP地址。结果按网络字节顺序;4 byte长度的字节数组;
36. Inet6Address{#inet6}
格式:(H)(D)
- H:类型标记;取值如下:
- 0x36:标记是java.net.Inet6Address类型;
- D:此InetAddress对象的原始IP地址。结果按网络字节顺序;16 byte长度的字节数组;
37. InetSocketAddress
格式:(H)(D)(P)
- H:类型标记;取值如下:
- 0x37:标记是java.net.InetSocketAddress类型;
- D:Inet4Address类型或者Inet6Address类型;
- P:端口号;2 byte长度的int类型;
38. Class
格式:(H)(D)
- H:类型标记;取值如下:
- 0x27:标记是java.lang.Class类型;
- D:类的完全限定名;String类型,参考String类型;
6. 性能评测
详见:http://www.xson.org/project/xson/1.0.2/testing.html
7. 技术文档
http://www.xson.org/project/xson/1.0.2/
8. 沟通交流
QQ群:518522232**(请备注关注的项目)**
邮箱:xson_org@126.com
转载于:https://my.oschina.net/xson/blog/1492584
xson 1.0.2 发布,新增byte[] buffer,支持XCO相关推荐
- 联想乐云记事2.0高调发布 新增智能语音识别 [多平台]
乐云记事 ( http://n.lenovo.com )是联想公司旗下出品的跨平台智能同步笔记工具,其前身为乐记事,是联想手机乐Phone的内置应用.近期联想全新高调发布了乐云记事 2.0,不仅具有同 ...
- JBolt 1.5.0新版发布,升级到支持最新版JFinal和Jetty,实现了在线更新插件功能
2019独角兽企业重金招聘Python工程师标准>>> JBolt是一个JFinal极速开发框架 定制版IDE插件 目前仅有Eclipse插件版,Idea插件版正在开发中. JBol ...
- 华为9月3日或推出麒麟9000;TiDB 3.0.18 发布| 极客头条
「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 国内要闻 华为9月3日举行IFA活动:推出麒麟9000,Ma ...
- 爱奇艺回应遭做空;百度 App 部分频道停更;React Native 0.62 发布 | 极客头条
整理 | 屠敏 头图 | CSDN 下载自东方 IC 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 一分钟 ...
- OpenKruise v0.10.0 版本发布:新增应用弹性拓扑管理、应用防护等能力
简介:阿里云开源的云原生应用自动化管理套件.CNCF Sandbox 项目 -- OpenKruise,今天发布 v0.10.0 新版本,这也会是 OpenKruise v1.0 之前的最后一个 mi ...
- 微信 for Mac 3.1.0 测试版发布(附安装包),新增「发朋友圈」功能
今年 3 月份,微信 for Mac 3.0 发布,上线了「朋友圈」功能,但当时还只能「刷朋友圈」,而不能「发朋友圈」. 近日,微信 for Mac 3.1.0 测试版发布,此版本新增了「发朋友圈」和 ...
- 鸿蒙测试版苹果,华为鸿蒙OS 2.0开发者Beta新增招募 苹果macOS 11.4测试版发布
华为鸿蒙OS 2.0开发者Beta新增招募 HarmonyOS 这是一个面向万物互联时代的全场景分布式操作系统,华为希望和其他的伙伴还有开发者一起来构建面向万物互联时代的超级终端体验. 据了解,在20 ...
- 七牛云 转码_YYC松鼠短视频系统V2.0版本发布,亮点新增转码加水印功能
YYC松鼠短视频系统V2.0版本发布,亮点新增转码加水印功能 YYC松鼠短视频系统2020年03月18日V2.0日志: 1.新增上传视频自动转码添加水印功能,水印可以设定四个位置,左上角,右上角,左下 ...
- 产品周报第27期|会员新增拉黑用户权益;CSDN APP V5.1.0版本发布……
hello,大家好,这里是「CSDN产品周报」第27期.本次更新主要涉及APP.问答及会员权益,欢迎大家详细了解和使用. 一.CSDN APP V5.1.0版本发布 1.首页导航支持自定义 首页增加用 ...
最新文章
- MySQL模拟Oralce闪回操作
- CF633C Spy Syndrome 2
- Qt QML 实现Android相册展示
- WebAssembly 系列(五)为什么 WebAssembly 更快? 1
- 多个独立的forEach循环, 内部处理条件是一样,代码优化方案
- 关于SAP Spartacus的Action - LoadCmsPageData
- build.gradle里uploadArchives标签的实现原理
- 订单生产计划表范本_工厂生产管理为什么需要ERP软件?
- 模拟智能手环的时间显示功能 c语言,HT1635AHT1635B在穿戴式运动手环的LED显示之C语言版.PDF...
- 没有bug队——加贝——Python 练习实例 33,34
- 拓端tecdat|python缺失值处理案例分析:泰坦尼克数据
- java jar包 资源_一个小坑:java如何访问依赖jar包中的资源文件
- Java毕设_小区停车管理系统
- 感知机为什么不能表示“异或”?
- java 读取文本_Java如何读取txt文件的内容?
- 算法工程师的工程修养:Linux 服务器性能故障分析
- 便携式储能系统---“钱景”无限
- 1-4 Linux 标准目录结构FHS
- 数字人民币试点目前呈现“全面开花”态势
- python编程题练习_Python编程练习1,python,练习题
热门文章
- 中国防卫科技学院计算机,2014高考专业介绍:科技防卫
- mysql远程连接3306不通问题
- sigmod 函数与softmax 函数对比
- 领英精灵和领英助理哪个好,看这一篇就够了
- 在短短几分钟内用冰柱构建超快速PHP服务器
- 基于微信小程序的网上订餐系统 报告+任务书+开题报告+文献综述+中期PPT+外文翻译及原文+PPT+项目源码及数据库文件
- 二十九幅图片所展现的意境:壮美!
- 职业推手自曝微博炒作内幕 十万水军任你调遣!
- python非线性可分支持向量机模型(实现iris分类)
- Mac一些基本常用快捷键的使用