阅读更多

29顶
0踩

开源软件

XBlink 1.0.0版发布,更轻、更快、更好用。

 

 

 

简介:

 

一个轻量级的通用型序列化反序列化工具

 

特点:

 

  • -- 当前版本,无需引入任何第三方jar包,JDK1.5以上适用,大小总共120K
  • -- 简单易用,基本上只需调用一个方法就能帮你搞定问题。
  • -- 无需配置Mapping文件,采用了基于注解的方式,对原有程序基本不造成任何负面影响,最大程度的降低耦合
  • -- 代码量少,结构简单,易于研究学习。
  • -- 采用全新架构,理论上支持所有以文本格式记录信息的文件的序列化工作。本产品将默认支持XMLJSONYAML格式。
  • -- 性能优秀,在速度上已经全面超越XStream,是目前最快的XML序列化工具。

 

XBlink当前情况:

 

该版本目前仅提供了XML的序列化支持,后续版本将支持JSON与YAML格式。

相比之前的版本,采用了新架构,jar包体积稍胖(比XStream还是小很多的),功能与性能上有了大幅提高,并提供了更多的扩展机制。

 

新版本的特性:

 

  • 精简后的注解,简化的API。
  • 支持无注解无配置,直接对现有系统中的类进行序列化。
  • 支持自定义转换器,定制你自己的输出格式。
  • 支持文本格式压缩,以适应开发与生产环境。
  • 支持替换底层输入输入器,你完成可以制造出个性化的“XML”。
使用示例:

定义两个类,Person与PhoneNumber。
public class Person {
	private String firstname;
	private String lastname;
	private PhoneNumber phone;
	private PhoneNumber fax;
	// ... constructors and methods
}

public class PhoneNumber {
	private int code;
	private String number;
	// ... constructors and methods
}
 

实例化一个Person对象。

 

PhoneNumber phone = new PhoneNumber();
phone.setCode(123);
phone.setNumber("1234-456");

PhoneNumber fax = new PhoneNumber();
fax.setCode(123);
fax.setNumber("9999-999");

Person joe = new Person();
joe.setFirstname("Joe");
joe.setLastname("Walnes");
joe.setPhone(phone);
joe.setFax(fax);
 


注册本次序列化使用的类(这里是为了生成的文件格式更加适合阅读),这一步可以省略。

 

XBlink.registerClassesToBeUsed(new Class[] { Person.class, PhoneNumber.class });
 

调用XBlink的序列化方法。

System.out.println(XBlink.toXml(joe));

  

输出结果。

 

<?xml version="1.0" encoding="UTF-8"?>
<person>
  <firstname>Joe</firstname>
  <lastname>Walnes</lastname>
  <phone>
    <code>123</code>
    <number>1234-456</number>
  </phone>
  <fax>
    <code>123</code>
    <number>9999-999</number>
  </fax>
</person>
 

调用XBlink的反序列化方法。

 

// 这里的xml就是刚才序列化生成的字符串
Person anthorJoe = (Person) XBlink.fromXml(xml);
 

怎么样,是不是如此简单!

 

性能测试:

 

常用的XML序列化框架有XStreamSimple

在速度与易用性上,XStream远远好于Simple,所以XBlink就一直以XStrem作为目标,无视Simple的存在(吐槽下,因为它是在是太难用啦,不信看这里)。


下面是基于上面那个Person示例的测试结果。


序列化比较:


 

序列化次数 XBlink XStream
1次 0 秒, 0 毫秒, 269 微秒 0 秒, 0 毫秒, 562 微秒
10次 0 秒, 2 毫秒, 2182 微秒 0 秒, 5 毫秒, 5426 微秒
100次 0 秒, 21 毫秒, 21454 微秒 0 秒, 37 毫秒, 37727 微秒
1000次 0 秒, 95 毫秒, 95380 微秒 0 秒, 116 毫秒, 116551 微秒
10000次 0 秒, 436 毫秒, 436216 微秒 0 秒, 623 毫秒, 623156 微秒


反序列化比较


 

反序列化次数 XBlink XStream
1次 0 秒, 0 毫秒, 557 微秒 0 秒, 0 毫秒, 767 微秒
10次 0 秒, 4 毫秒, 4231 微秒 0 秒, 5 毫秒, 5680 微秒
100次 0 秒, 21 毫秒, 21346 微秒 0 秒, 34 毫秒, 34830 微秒
1000次 0 秒, 84 毫秒, 84463 微秒 0 秒, 162 毫秒, 162964 微秒
10000次 0 秒, 616 毫秒, 616956 微秒 1 秒, 1282 毫秒, 1282416 微秒

 

相关测试用例请看http://code.google.com/p/xblink/source/browse/trunk/test/performance/testcase/demo/PersonTest.java

 

通过上面的对比,可以发现XBlink在性能上比XStream有大概30%-120%的提升,速度全面超越,基本上现有的框架中XBlink是最快的

 

说明:

 

终于XBlink发布了,算是还债了,呜呜呜。

虽然目前已经取得了一定的成绩,但是在稳定性,易用性与性能上还有很大的提高余地。

欢迎各位朋友下载,试用并提出您宝贵的意见与发现的Bug,ME将尽力尽快的改进,使其更加好用。

 

总是,求下载,求使用,求反馈,求Bug,求虐,求包养...

 

最后:

 

更多详情请关注官网:http://code.google.com/p/xblink/

下载地址:http://code.google.com/p/xblink/downloads/detail?name=XBlink-1.0.0.zip&can=2&q=


PS:由于时间仓促,官网上关于1.0.0版的文档还在陆续编写中,请持续关注,谢谢。

29
0
评论 共 72 条 请登录后发表评论
72 楼 hhdxwss 2011-11-04 08:43
首先赞一个。发现下面问题,就是对 如下例。
<!--
   <one>1</one>
   <! --
   <two>2</two>
    -- >
-->
   <three>3</three>

无法反解,提示
Caused by: java.lang.RuntimeException: org.xblink.rep.org.xmlpull.v1.XmlPullParserException: in comment after two dashes (--) next character must be > not   (position: END_TAG seen ...<TnameSqlList>\r\n\t\t  < !-- ... @1254:11)
71 楼 hhdxwss 2011-11-03 01:29
       @XBlinkAsAttribute
DBDstFieldType dstFieldType;// 字段传递方式 来自源表,配置

List<String> pretreatDstSqls;

@XBlinkAsAttribute
String dstTablename;
参见上面,在一个类中 有两个@XBlinkAsAttribute 设置,其中DBDstFieldType dstFieldType 是一个枚举变量,则该字段无法放置到xml的属性中,也成为一个子字段。
如下:<dumpTableInfoList>
      <dumpTableInfo dstTablename="A001HzJkQs">
        <dstFieldType>FromSrcTable</dstFieldType>
        <pretreatDstSqls> 。。。。。
不知道是何原因?
70 楼 hhdxwss 2011-11-03 01:27
另,在一个类中添加两个 @XBlinkAsAttribute
DBDstFieldType dstFieldType;// 字段传递方式 来自源表,配置

List<String> pretreatSrcSqls;
List<String> pretreatDstSqls;

@XBlinkAsAttribute
String dstTablename;
69 楼 hhdxwss 2011-11-03 01:16
首先,赞一个。 另,我在使用的过程中,发现如下问题。1、使用toXML(),会出现,<string>...here fdate>=(select max(fdate)from csHoliday where fdate&lt;getdate()...</string> ,即 字符串中会出现“>=” 和 fdate&lt;getdate(), 实例中的内容是 fdate> = .. 和 fdate< = ... ,这个不知道会否出现问题。 2、如何设置输出XML的时候,直接字符编码成为"gbk" ,因为ue 打开会出现乱码,目前输出是"utf-8"。 
68 楼 suyulin6688 2011-10-24 17:42
用上了这个,XBlink.toXml() 和 XBlink.fromXml() 果然很强大。

至于 toJson 和 fromJson,就不必了吧。fastjson和jackson都已经做得很好了。
67 楼 feiyu86 2011-10-22 15:42
估计工作中会用到,先好好看看。
66 楼 pangwu86 2011-10-14 22:42
yangtaoorange 写道
<person>  
  <firstname>Joe</firstname>  
  <lastname>Walnes</lastname>  
  <phone>  
    <code>123</code>  
    <number>1234-456</number>  
  </phone>  
  <fax>  
    <code>123</code>  
    <number>9999-999</number>  
  </fax>  
</person> 
如果想生成如:<firstname name="tt">Joe</firstname>的形式,怎么实现呢

给name字段加注释 @XBlinkAlias
65 楼 yangtaoorange 2011-10-14 09:47
<person>  
  <firstname>Joe</firstname>  
  <lastname>Walnes</lastname>  
  <phone>  
    <code>123</code>  
    <number>1234-456</number>  
  </phone>  
  <fax>  
    <code>123</code>  
    <number>9999-999</number>  
  </fax>  
</person> 
如果想生成如:<firstname name="tt">Joe</firstname>的形式,怎么实现呢
64 楼 zozoh 2011-10-12 16:20
pangwu86 写道
zozoh 写道
实话说,这个 Logo 稍微有点 ...-> 
一直想给你设计个好看的 Logo 不知到你愿意不?
我也不是非常好的设计人员,我的价格 是一个 Logo 2000RMB,设计到你满意
但是对你你这个项目,我不打算收钱 

求之不得呀,那就让logo来的更猛烈些吧

好那我弄完给你选
63 楼 shiren1118 2011-10-11 19:33
shiren1118 写道
pangwu86 写道
viluo 写道
学习一下,同时支持一下楼主的开源行为

代码结构很简单,应该挺容易看懂的,让其如何保持简单,也是ME一直努力的目标

rf
pangwu86 写道
yin_bp 写道
pangwu86 写道
qiuboboy 写道
能序列化父类中的field吗?

你指的是什么?不太明白

qiuboboy指的应该是Person类继承了一个Man类,在序列化Person时能不能把Man中的属性也序列化出来。


那就请在Man类中,不想序列化的字段上加XBlinkOmitField注解。

暂时没有专门针对父类的设置。

sssss


dsfsadfdfasdffsdffsdfdd
62 楼 shiren1118 2011-10-11 19:30
pangwu86 写道
viluo 写道
学习一下,同时支持一下楼主的开源行为

代码结构很简单,应该挺容易看懂的,让其如何保持简单,也是ME一直努力的目标

rf
pangwu86 写道
yin_bp 写道
pangwu86 写道
qiuboboy 写道
能序列化父类中的field吗?

你指的是什么?不太明白

qiuboboy指的应该是Person类继承了一个Man类,在序列化Person时能不能把Man中的属性也序列化出来。


那就请在Man类中,不想序列化的字段上加XBlinkOmitField注解。

暂时没有专门针对父类的设置。

sssss
61 楼 pangwu86 2011-10-11 16:36
vipbooks 写道
最近用jackson来处理JSON感觉还不错,速度也快,不知道你们的和jackson比较怎么样,希望你们快点出支持JSON的,还是很支持你们的!

ME也希望早点推出
60 楼 vipbooks 2011-10-11 16:27
最近用jackson来处理JSON感觉还不错,速度也快,不知道你们的和jackson比较怎么样,希望你们快点出支持JSON的,还是很支持你们的!
59 楼 pangwu86 2011-10-11 15:36
同志们,关于XBlink是如何实现扩展的,请看下这里,欢迎提出你们的意见。
http://pangwu86.iteye.com/blog/1188822
58 楼 pangwu86 2011-10-11 12:51
unique.wu 写道
对象非常大,序列化为xml文件容量超过百M的时候,性能怎样?
百M的xml反序列化会怎样?


说实话,还没测。

不过新版的XBlink底册采用了XML Pull Parsing,基于事件驱动,类似sax,理论上比之前0.7.0版用Document更好的支持大文件,但能有多大,还需测试。

后面会补充这个测试用例的
57 楼 unique.wu 2011-10-11 12:35
对象非常大,序列化为xml文件容量超过百M的时候,性能怎样?
百M的xml反序列化会怎样?

56 楼 foohsinglong 2011-10-11 11:11
嘿嘿,这个logo的意思是叉逼....
55 楼 pangwu86 2011-10-11 03:17
zozoh 写道
实话说,这个 Logo 稍微有点 ...-> 
一直想给你设计个好看的 Logo 不知到你愿意不?
我也不是非常好的设计人员,我的价格 是一个 Logo 2000RMB,设计到你满意
但是对你你这个项目,我不打算收钱 

求之不得呀,那就让logo来的更猛烈些吧
54 楼 zozoh 2011-10-11 02:25
实话说,这个 Logo 稍微有点 ...-> 
一直想给你设计个好看的 Logo 不知到你愿意不?
我也不是非常好的设计人员,我的价格 是一个 Logo 2000RMB,设计到你满意
但是对你你这个项目,我不打算收钱 
53 楼 pangwu86 2011-10-10 23:53
Wind_ZhongGang 写道
楼主可以使用Maven管理下项目嘛,这样我们在项目中使用只需要添加一个dependency就可以使用,给使用者带来很大方便的,现在大部份开源项目都应该支持了maven管理的,楼主要随大流。 

行,ME去学学,争取下个版本吧

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • SQL子查询语句简单示例

    SQL 中的 SELECT 命令不仅能够直接用来查询数据库中的数据,还能够嵌入到 WHERE 中作为子查询语句,或者将查询结果插入到另一个表中。   将子查询用于 WHERE 子句   子查询能够与 SELECT、INSERT、UPDATE 和 DELETE 语句一起使用。   下面以 SELECT 语句作为示例: SELECT id, name FROM table1 WHERE id in ( SELECT id FROM table2);   在上面所给的例子中,我们将子查询的结果作为一个集合,使用 in 成员测试运算来筛选出同时存在于 table1 和 table2

  • SQL语句之子查询

    SQL语句中子查询

  • 【SQL查询系列】子查询经典案例

    前言 近期在补SQL的基础,特别整理了一下SQL的一些查询练习语句,边学边笔记,持续更新~ 数据库 查询案例 1. 查询工资最低的员工信息: last_name, salary #①查询最低的工资 SELECT MIN(salary) FROM employees #②查询last_name,salary,要求salary=① SELECT last_name,salary FROM employees WHERE salary=( SELECT MIN(salary) FROM employees

  • sql 子查询及基本语句 挺全的收录

    引自https://blog.csdn.net/jia_gugang/article/details/80282873一、SQL子查询语句      1、单行子查询        select ename,deptno,sal        from emp        where deptno=(select deptno from dept where loc='NEW YORK');   ...

  • SQL实战:子查询的应用实例

    本实例设计到的SQL语法包括: select , delete, distict, not exists, not in, group by, having, min, max

  • Oracle从零开始07——SQL语句06——子查询

    8. 子查询 子查询定义:在一个查询的内部还包括另外一个查询 子查询格式:在小括号中编写代码 SELECT DISTINCT *|列名 别名 FROM 表名 别名 {括号内容就是子查询 SELECT DISTINCT *|列名 别名 FROM 表名 别名 {WHERE 条件(s)} {GROUP BY分组条件{HAVI...

  • 数据库基础和T-SQL语句编程

     第一章 SQL Server数据库基础1.         使用数据库的必要性:l         可以结构化的存储大量的数据信息,方便用户进行有效的检索和访问l         可以有效地保持数据信息的一致性、完整性、降低数据冗余l         可以满足应用的共享和安全方面的要求l         数据库技术能够方便智能化的分析,产生新的有用信息2.      

  • mysql数据库个人总结

    mysql个人总结

  • 各种SQL子查询实例

    返回订单表中订单价值超过5000美元的那些客户的详细信息。 SELECT * FROM customers WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders WHERE order_value &gt; 5000); 子查询也可以与INSERT语句一起使用。 INSERT INTO premium_customers SELECT * FROM customers WHERE cust_id IN (SELECT DISTINCT cust_i..

  • sql 子查询的一些例子

    1、单行子查询         select ename,deptno,sal         from emp         where deptno=(select deptno from dept where loc='NEW YORK');      2、多行子查询         SELECT ename,job,sal         FROM EMP

  • 用一个简单的例子说明SQL子查询

    SQL的子查询(subqueries) 用一个简单的例子来说明subqueries的应用。 现有两个表格,第一个表格名为student,第二个表格名为student_information。 第一个表格: 第二个表格: 两个表格有一含有相同数据的列student_num,用来表示学生学号。 那么老板布置了这么一个任务,请你找出名为Chris的同学的微信号。 要完成这个任务,有两个方法可以采用。第一个方法是使用两次SELECT语句,第二个方法是只用子查询。 第一个方法的具体步骤: SELECT stude

  • MySQL子查询

    回顾:查询员工中工资大于公司平均工资的员工的last_name,salary和其department_id。① 如果子查询相对较简单,建议从外往里写。不相关子查询的需求:查询工资大于本公司平均工资的员工信息。比如:相关子查询的需求:查询工资大于本部门平均工资的员工信息。#子查询的编写技巧(或步骤):① 从里往外写 ② 从外往里写。IN ANY ALL SOME(同ANY)② 如果是相关子查询的话,通常都是从外往里写。相关子查询 vs 不相关子查询。单行子查询 vs 多行子查询。

  • mysql查询语句,子查询的几种方式

    1.子查询的语法 子查询的语法与正常的sql查询语句一致,只是嵌套在sql语句中,通常用来简化多表联查,也可以与多表联查混合使用,子查询语句可以嵌套在select,form,where等关键字后. 例如: select(子查询) form 表 where 条件 select 返回值 form (子查询)where 条件 select 返回值 form表 where (子查询) 需...

  • 数据库学习(九)—SQL数据查询06(子查询)

    目录 3.9子查询 3.9.1标量子查询 3.9.2列级子查询 3.9.3 行级子查询 3.9.4表级子查询 3.9.5子查询中特定关键字使用 3.9.6 ‼总结 3.9子查询 在一个select语句中,嵌入了另外一个select语句.那么被嵌入的select语句称之为子查询语句 主查询 主要查询的对象第一 条select语句 主查询和子查询的关系 子查询是嵌入到主查询中 子查询是辅助主查询的,要么充当条件,要么充当数据源 子查询是可以独立存在的语句,...

  • SQL中的子查询

    当我们进⾏语句查询的时候,总会遇到我们需要的条件需要通过另⼀个查询语句查询出来后才能进⾏,就是说A 查询语句需要依赖B 查询语句的查询结果,B 查询就是⼦查询,A 查询语句就是主查询,⼀个SQL语句可以包含多个⼦查询。

  • MySQL的三种子查询

    今天学习 MySQL 子查询,先来干货再看看实际中如何运用。 一、何为子查询? 一条 select 查询语句的结果, 作为另一条 select 语句的一部分。 二、子查询特点? 1、子查询要放在小括号里 2、子查询作为父查询的查询条件使用。 三、子查询分类? 1、where 型语法: SELECT 查询字段 FROM 表 WHERE 字段=(子查询); 2、from 型语法: SELECT 查询字段 FROM (子查询)表别名 WHERE 条件; 3、ex...

  • 子查询小例子

    select (select a.ename from emp a where a.empno=7369) aa from emp aa smith smith smith smith smith smith smith smith smith smith smith smith smith smith 一共14条 我觉得 select字段内的子查询是外查...

  • 简单的子查询 (案例)

    子查询:可以实现多表关联查询 ------查找李斯文的出生日期,查找比李斯文大的学生------- ---方法一:分两步实现 SELECT `bornDate`FROM `student` WHERE `studentName`='李斯文';SELECT studentNo,studentName,sex,bornDate,address FROM `student`...

  • MySQL之子查询经典案例

    MySQL之子查询经典案例 此博客包含所有类型的子查询,看完后你将可以掌握各种类型的子查询,需要数据库文件的请关注博主,私信博主获取 1、 查询工资最低的员工信息: last_name, salary #①查询最低的工资 SELECT MIN(salary) FROM employees #②查询last_name,salary,要求salary=① SELECT last_name,salary FROM employees WHERE salary=( SELECT MIN(salary) F

  • 数据库的子查询

    1、子查询: 使用子查询是指,在一个select语句中还嵌套着另一个select语句 示例: select cust_id from orders where order_num in (select order_num from orderItems where prod_id = 'RGAN01'); 注意: 作为子查询...

Global site tag (gtag.js) - Google Analytics