阅读更多

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查询语句中嵌套另一个完整的查询语句,以获取更精确或相关的数据。在编写子查询时,建议参考数据库系统的文档和使用指南,以确保正确和高效地使用子查询。需要注意的是,使用子查询时应考虑查询的性能和效率。上述示例中,子查询嵌套在WHERE子句中,用于在table1中选取满足条件的数据,其中条件是检查table2的某一列。上述示例中,子查询被嵌套在FROM子句中,作为一个临时表(或视图)使用,供外层查询使用。上述示例中,子查询嵌套在HAVING子句中,用于与外层查询的聚合函数结果进行比较。

  • SQL中的子查询

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

  • 25.6 MySQL 子查询

    【代码】25.6 MySQL 子查询。

  • 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语句面试题目:一般查询和高级子查询

    几个表 employees 表:  EMPLOYEE_ID              NUMBER(6)  FIRST_NAME                VARCHAR2(20)  LAST_NAME                 VARCHAR2(25)  EMAIL                               VARCHAR2(25)  PHONE_NUM...

  • Oracle学习笔记(二)SQL语言基础(简介,用户模式,检索数据,常用系统函数,子查询,数据库操作)

    目录 1.SQL语言简介 特点: 分类: 编写规则 2.用户模式 模式与模式对象 示例模式scott 3.检索数据 简单查询 筛选查询 分组查询 排序查询 多表关联查询 4.Oracle常用系统函数 字符类函数 数字类函数 日期和时间类函数 转换类函数 聚合类函数 5.子查询的用法 什么是子查询 单行子查询 多行子查询 关联子查询 6.操作数据库 ...

  • Oracle的基本操作+Oracle字段类型(zz)

    在Oracle关于时间属性的建表 Example: create table courses( cid varchar(20) not null primary key, cname varchar(20) not null, ctype integer, ctime date DEFAULT SYSDATE, cscore float not null ...

  • sql的子查询与外键

    子查询:在一个select语句中,嵌入了另外的一个select语句,那么被嵌套的select语句称为子查询语句。 主查询:主查询的对象,第一条select语句。 主查询与子查询的关系: 1.子查询是嵌入到主查询中的。 2.子查询是辅助主查询的,要么充当条件,要么充当数据源。 3.子查询是可以独立存在的语句,是一条完整的select语句。 标量子查询:就是一个查询的一个值,一

  • SQL嵌套Select语句的用法

    http://database.51cto.com/art/201011/233200.htm SQL嵌套SELECT语句是很常见的SQL语句,下面就为您详细介绍SQL嵌套SELECT语句的语法,并附相关示例,供您参考学习之用。 嵌套SELECT语句也叫子查询,一个SELECT 语句的查询结果能够作为另一个语句的输入值。子查询不但能够出现在Where子句中,也能够出现在from子句

  • SQL子查询

    SQL子查询是一种在SQL语句中嵌入另一个SQL查询的技术,它可以帮助我们更有效地查询数据库中的数据。内连接子查询是指在一条SQL语句中,将两个或多个表的数据进行连接,从而查询出满足条件的数据。SQL子查询可以帮助我们更有效地查询数据库中的数据,但是也要注意,使用SQL子查询时,要注意查询语句的正确性,以及查询语句的效率。此外,在使用SQL子查询时,还要注意数据库的版本,以及数据库的性能。外连接子查询是指在一条SQL语句中,将两个或多个表的数据进行连接,从而查询出满足条件的数据。

  • 各种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 子查询,如何使用 SQL 子查询

    文章目录一、子查询二、利用子查询进行过滤三、作为计算字段使用子查询四、小结 本文介绍什么是 SQL 子查询,如何使用它们。子查询常用于 WHERE 子句的 IN 操作符中,以及用来填充计算列。 一、子查询 SELECT 语句是 SQL 的查询。我们迄今为止所看到的所有 SELECT 语句都是简单查询,即从单个数据库表中检索数据的单条语句。 查询(query) 任何 SQL 语句都是查询。但此术语一般指 SELECT 语句。 SQL 还允许创建子查询(subquery),即嵌套在其他查询中的查询。为什么要

  • SQL 子查询以及子查询作为建表语句

    多行多列子查询: 问题:如何查询高于自己部门平均工资的员工信息 1、查询各个部门的平均工资和部门号 select e.deptno,avg(e.sal) from emp e group by e.deptno 2、把上面的查询结果看做是一个子表,并且命名为a   (select e.deptno,avg(e.sal) from emp e group by e.deptno) a

  • 常用SQL语句:子查询

    子查询 子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式 子查询返回的数据分类 单行单列:返回的是一个具体列的内容,可以理解为一个单值数据 单行多列:返回一行数据中多个列的内容 多行单列:返回多行记录之中同一列的内容,相当于给出了一个操作范围 多行多列:查询返回的结果是一张临时表 子查询常出现的位置 select之后:仅支持单行单列 from之后:支持多行多列 where或having之后:支持单行单列、单行多列、多行单列 子查询实例

  • MySQL的三种子查询

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

  • 简单的子查询 (案例)

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

  • 子查询案例讲解

    #1.查询和Zlotkay相同部门的员工姓名和工资 #(1)查询姓名为Zlotkey的部门编号 SELECT `department_id` FROM `employees` WHERE `last_name`='Zlotkey'; #查询部门编号与(1)相等的员工姓名和工资(标量子查询) SELECT `last_name`,`salary`,`department_id` FROM `employees` WHERE `department_id`=( SELECT `department_id` FR

  • SQL Server 数据库子查询基本语法

    一、SQL子查询语句 1、单行子查询select ename,deptno,salfrom empwhere deptno=(select deptno from dept where loc='NEW YORK'); 2、多行子查询SELECT ename,job,salFROM EMP...

  • 子查询2

    1、子查询:为什么要子查询? 现有一数据表如下: 根据之前的知识我们可以查出每门科目的最高分,但是要想查出取得最高分的学生信息就做不到了。这时就需要用到子查询来取得完整的信息。 什么是子查询?子查询就是嵌套在主查询中的查询。 子查询可以嵌套在主查询中所有位置,包括SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。 但并不是每个位置嵌套子查询都是有...

  • sql语句的子查询

    子查询又叫嵌套查询,总结一下子查询的各种操作和处理,以便于记忆和熟练的运用。 概念:什么是子查询? 子查询就是将一个查询语句嵌套在另一个查询语句中,内层语句的查询结果,可以作为外层查询语句的条件。 使用条件:引发子查询的情况 1、使用【not】in 的子查询 2、使用比较运算符的子查询(=、&gt; 、&gt;=、 &lt;=、 &lt;&gt;、 !=、 &lt;=&gt;) 3、使用[not] exists 的子查询 4、使用any some 或者 all 的子查询,具体如右图: ...

Global site tag (gtag.js) - Google Analytics