文档章节

xson 1.0.2 发布,新增byte[] buffer,支持XCO

x
 xson_org
发布于 2017/07/31 11:18
字数 4008
阅读 841
收藏 13
点赞 0
评论 2

1. 项目介绍

Xson

Xson是一个Java对象序列化和反序列化框架。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。

官网地址:http://xson.org

项目地址:https://git.oschina.net/xsonorg/xson

2. 新版本特性

  1. 新增buffer包,此包中的相关类提供对序列化过程中的byte[]进行分配、使用、回收的管理;进一步提供序列化的速度,并减少Full GC。
  2. 提供带有偏移内容的API支持;
  3. 提供XCO对象序列化和反序列的支持;
  4. 提供扩展配置文件的支持;

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.numberByteArrayManager管理的byte[]数量,默认100;

byteArray.capacityByteArrayManager管理的每个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 code
		return null;
	}
}

2.添加用户自定义的Serializer和Deserializer

XsonSupport.addCustomSerializer(User.class, new CustomerSerializer(), new CustomerDeserializer());

注意: Serializer和Deserializer必须成对设置.

4. 技术设计

4.1 类图设计

类图设计

  1. XSON:用户入口类,提供序列化和反序列化方法;
  2. WriterModel:序列化写入模型类;
  3. XsonWriter:序列化接口;
  4. ArraySerializer:对象数组序列化类;
  5. CollectionSerializer:集合对象序列化类;
  6. EnumSerializer:枚举对象序列化类;
  7. MapSerializer:Map对象序列化类;
  8. Other Serializer:其他类型对象序列化类,详见源码;
  9. ReaderModel:反序列化读取模型类;
  10. XsonReader:反序列化接口;
  11. CurrencyDeserializer:货币对象反列化类;
  12. DateUtilDeserializer:时间对象反列化类;
  13. LocaleDeserializer:地区对象反列化类;
  14. LongDeserializer:Long包装对象反列化类;
  15. Other Deserializer:其他类型对象反列化类,详见源码;
  16. XsonConst:常量类,持有所有的序列化类和反序列化类实例;

4.2 byte[]管理

Xson

  1. 浅绿色:byte[],由ByteArrayManager类进行管理,在其内部持有多个byte[],容量均一致;在序列化过程中ByteArrayManager提供byte[]的申请和回收管理;
  2. 深绿色:byte[],序列化过程中临时创建的,不受ByteArrayManager管理,使用后由GC处理;
  3. 淡蓝色:ByteArrayItem类;基于byte[]的封装类,其内容记录byte[]capacitylimit等使用属性;
  4. 黄色: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

© 著作权归作者所有

共有 人打赏支持
x
粉丝 19
博文 22
码字总数 34888
作品 5
海淀
加载中

评论(2)

局长
局长

引用来自“红薯”的评论

软件更新资讯应该在社区上投递新闻哦,这样就可以在首页显示:)
作者已经投递新闻了,不过里面一些和更新无关的内容被我去掉了
红薯
红薯
软件更新资讯应该在社区上投递新闻哦,这样就可以在首页显示:)
xson 1.0.2 发布,增加 byte[] buffer,支持 XCO

xson 1.0.2 已发布,新版增加了 byte[] buffer,支持 XCO。 新版本特性 新增buffer包,此包中的相关类提供对序列化过程中的byte[]进行分配、使用、回收的管理;进一步提供序列化的速度,并减...

xson_org
2017/07/31
719
0
通用数据对象--XCO

XCO 1. XCO简介 XCO(XSON common object)是一种通用的数据对象, 底层采用一种类似Map的数据结构进行数据的存储访问,能够方便的以XML方式对数据对象进行序列化和反序列化,适合同构、异构系统...

xson_org
2016/12/17
236
0
TangYuan使用教程-Spring整合

Spring中的整合配置 在Spring的配置文件中增加一下内容: 2. 说明 为Spring集成TangYuan的初始化Bean 为Spring服务方法添加的拦截器 2. 服务的编写和调用 tangyuan-sqlservices.xml SELECT ...

xson_org
2016/12/15
49
0
Xson:Java对象序列化和反序列化工具

1.Xson介绍 Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 地址:https://github.com/xsonorg/xson 2.应用场景 可用于网络...

xson_org
2014/07/20
2.5K
8
xson_org/xco-js

XCO-JS XCO-JS是一款以XCO数据对象为基础,集数据封装、数据请求、模板渲染、数据绑定和数据验证为一体的综合性JS框架。 2. 当前版本 当前最新版本:1.0.1 3. 代码片段 模板渲染...

xson_org
2017/08/06
0
0
Java对象序列化和反序列化工具--Xson

Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven: <dependency> <groupId>com.github.xsonorg</groupId> <artifactId>......

红薯
2014/07/22
750
3
使用教程和技术设计

章节目录 第一篇 快速入门 1. 一个完整的示例 第二篇 使用教程 1. 功能介绍 2. XML介绍 3. 数据源 4. 事务 5. 服务插件使用 6.SQL服务使用 6.1 SQL服务及标签介绍 6.2 基本SQL服务标签使用 ...

xson_org
2016/11/23
38
0
TangYuan之数据映射

数据映射 7.1 数据类型映射 数据类型映射指的是数据库中的数据类型和Java数据类型之间的映射关系:比如:默认情况下,Mysql中的类型对应Java中的类型,对应Java中的,对应Java中的等等,这些...

xson_org
2016/12/08
43
0
XCO-JS 1.0.1 版本发布,增强模板渲染和数据绑定

XCO-JS 1.0.1 版本已发布,XCO-JS是一款以XCO数据对象为基础,集数据封装、数据请求、模板渲染、数据绑定和数据验证为一体的综合性JS框架。 新版本特性 XCO请求支持结果检测和多成功事件; ...

xson_org
2017/08/06
338
3
Windows环境下安装Cassandra1.0.2

以Cassandra 1.0.2为例。 1、 安装文件准备 下载Cassandra1.0.2、Jdk 1.7。(全部推荐最新版本) Cassandra下载地址:http://cassandra.apache.org/download/ Jre下载地址:http://www.java...

玄空
2016/05/13
25
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
2
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
1
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
1
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
今天
2
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
1
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
2
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
1
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部