阅读更多

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中的子查询

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

  • sql语言之子查询语句

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

  • 第17章 子查询

    介绍子查询的使用、分类和注意事项,以及SELECT结构中哪些位置可以使用子查询。

  • mysql SQL子查询(史上最详细)

    这里,子查询从grades表中选择所有的student_id,然后外层查询从students表中选择那些id在子查询结果中的学生的姓名。子查询可以返回一个值、一列值或多行多列值,根据这些返回类型,子查询可以分为标量子查询、列子查询、行子查询和表子查询。这个例子中,子查询返回所有年龄大于18的学生的年龄,然后外层查询返回具有这些年龄的所有学生的姓名和年龄。这个例子中,子查询找出所有学生中最大的年龄,然后外层查询返回具有该年龄的学生的姓名和年龄。返回多行多列值的子查询,通常用在FROM子句中,作为一个临时表。

  • Mysql之子查询(知识点+例题)

    子查询指一个查询语句嵌套在另一个查询语句内部的查询SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量,也可能是某个集 合)进行比较。

  • sql子查询详解

    子查询指一个查询语句嵌套在另一个查询语句内部的查询。SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量,也可能是某个集合)进行比较。先引出几张简单的表,供后续使用,分别为emp员工表:dept部门表我们需要查出工资比id为2的员工的工资多的所有用户。解决方式: 注意事项:我们按内查询的结果返回一条还是多条记录,将子查询分为单行子查询 、 多行子查询 。上面的例子

  • SQL子查询

    SQL的子查询思路及实现

  • SQL入门之第十七讲——子查询

    子查询顾名思义,就是在在查询中,嵌套了一层子查询,用来完成更复杂的数据检索,子查询的结果将作为主查询的条件来使用 子查询主要的类型有: 子查询+ WHERE子句 子查询+ FROM子句 子查询+ SELECT子句 SQL语句中嵌套语句,是比较常见的,子查询用括号括起来。 基本语法: select &lt;字段名&gt; from &lt;表名&gt; where ( select &lt;字段名&gt; from &lt;表名&gt; ); 一般称外面的嵌套的语句为 主查询(也叫外查询),里面

  • 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语句:子查询

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

  • MYSQL 命令行大全 (简洁、明了、全面)

    MYSQL 命令行大全 (简洁、明了、全面) [sql] view plain copy print?&amp;lt;span&amp;nbsp;style=“font-size:18px;”&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MYSQL常用命令&amp;nbsp;&amp;nbsp;1.导出整个数据库&amp;nbsp;&amp;nbsp;mysqldump...

  • SELECT 语句中的 子查询(Sub Query)

    SELECT 语句中的子查询 子查询(Sub Query)或者说内查询(Inner Query),也可以称作嵌套查询(Nested Query),是一种嵌套在其他 SQL 查询的 WHERE 子句中的查询。 子查询用于为主查询返回其所需数据,或者对检索数据进行进一步的限制。 子查询可以在 SELECT、INS...

  • 各种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..

  • MySQL里面的子查询实例

    一,子选择基本用法 1,子选择的定义 子迭择允许把一个查询嵌套在另一个查询当中。比如说:一个考试记分项目把考试事件分为考试(T)和测验(Q)两种情形。下面这个查询就能只找出学生们的考试成绩 select * from score where event_id in (select event_id from event where type='T'); 2,子选择的用法(3种)

  • mysql查询3层_SQL学习笔记之MySQL查询的三层解析

    Mysqld的三层结构:SQL类型:DDL:数据库对象定义语言对库和表的定义DML:操作语言DCL:控制语言结构化的查询语言:select * from user;执行该语句时:1、连接层:验证 该用户的用户名、密码、端口号,并提供连接连接层作用: 1。提供连接协议(TCP/IP socket)2. 验证功能身份信息3、提供一个专门的连接线程(接受用户发来的SQL语句,并在执行完成之后返回最终结果...

  • 子查询经典案例

    # 1. 查询工资最低的员工信息: last_name, salary#①查询最低的工资SELECT MIN(salary)FROM employees#②查询last_name,salary,要求salary=①SELECT last_name,salaryFROM employeesWHERE salary=( SELECT MIN(salary) FROM employees);# 2. 查...

  • SQL 相关子查询例子

    例1 查询每个学期学分最低的课程的课程名、开课学期和学分。 SELECT Cname,Semester,Credit   FROM Course c1   WHERE Credit IN (     SELECT MIN(Credit) FROM Course c2       WHERE c1.Semester = c2.Semester )

Global site tag (gtag.js) - Google Analytics