`
pangwu86
  • 浏览: 116002 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

XBlink1.0.0版用户手册

阅读更多

公告:

由于googlecode的wiki编辑较为复杂,官网文档还需重新整理格式,这里先写一个1.0.0版的使用手册,让大家先了解下具体的使用。

 

用户API

 

对于XBlink作为普通用户只需要了解5或8个类即可,其他的都是内部使用,无需关心细节。


必备的:

两个核心类 XBlink.java XBConfig.java 

三个注解类 XBlinkAlias.java XBlinkAsAttribute.java XBlinkOmitField.java


XBlink


提供了序列化反序列方法,还有几个特殊的设置项。

 

PS:以下提及的输出指File,Ouputstream,Writer,输入指字符串,File,Inputstream,Readrer。


toXml


一种是只需一个参数(序列化的对象),结果返回对应XML字符串。

一种是需要两个参数(序列化的对象,输出),不再返回字符串,直接将结果写到输出。


fromXml


一种是只需一个参数(输入),根据输入将其提供的XML进行反序列化,返回对象。

一种是需要三个参数(输入,参考类,参考对象),其中参考类与参考对象可以二选其一,就是最终你想返回的类型是什么,你就放进去就好了,就会以此为依据,进行反序列操作,返回对象。

 

 

toAny 与 fromAny


这是一个扩展点,这个等后续版本实现了再详细讲解。


如果你特别想知道它能做什么


那么这样说吧,下面两个方法是等效的。

 

 

 

// 生成XML文件
XBlink.toXml(obj);

// 生成XML文件
XBlink.toAny(obj, "xml");
 

 


setGlobalXBConfig 与 setTransientXBConfig


设置运行时配置项,关于XBConfig请看后面介绍。

setGlobalXBConfig 是设置全局的,一直适用。

setTransientXBConfig 是设置一次性的,用过即抛,跟套套一个性质。

 

registerClassToBeUsed 与 registerClassesToBeUsed


注册你将要进行序列化的类。

如果不注册,XBlink是可以正常工作的,不过生成的XML会带有一部分类信息,看上去会不那么自然(怎么个不自然法你试一试便知),所以想要XML更合适阅读,推荐在一个static块中一次性注册所有可能要用的类。

例如:

 

static {
	// 注册一次即可
	Class<?>[] clzs = { Person.class, PhoneNumber.class };
	XBlink.registerClassesToBeUsed(clzs);
}
 

 

registerConverter


注册一个自定义转换器。

这个请参考后面的扩展点来理解。

 

XBConfig


提供了几个选项,可以设定你输出的文档一些特性。


newXBConfig

 

生成一个新的配置项。


setUseRelativePath


设置是否使用相对路径。默认是相对路径。


如果你序列化的类中存在循环引用的情况,那在写引用对象时,会输出类似下面这样一个节点。

 

<objA ref="../../objB/objA" />
 

 

 

ref记录的其相对当前节点的位置。


当然如果你设置使用绝对路径,那就会输入下面这样。

 

<objA ref="/objF/objE/objG/objB/objA" />
 

 

反正是可以帮你正确的找到引用对象的。


具体的实现思路可以看ME之前写的一篇文章

 

setIgnoreTransient


是否忽略设置为transient类型的字段。

默认忽略,因为JAVA的序列化就是这样认为的。

忽略的意思就是序列化时无视它,不多解释了。


setIgnoreNull


是否忽略值为null的字段。

默认忽略,也就是不输出了,因为反序列化时它也是null,也不用设置回去。

当然如果你非要在XML显示的告诉你这里有个字段并且它是空,那你就设置一下好了。


setCompact


设置生成的文本是否采用紧凑模式。

默认为否,会采用更适合人类阅读的格式,也就是有换行,制表符等标识的文档。

如果设为true,那你就会得到仅一行的文档,当然它的体积会小很多,也会让反序列化更快,所以更适合用在生产环境中。

 

——————————————————

后续版本中这个类会提供更多的可配置项


XBlinkAlias


可以在类上或字段上设置别名。


至于效果直接看下面,事实胜于雄辩。


定义一个Child类:

 

@XBlinkAlias("孩子")
public class Child {

        @XBlinkAlias("姓名")
        private String name;

        @XBlinkAlias("年龄")
        private int age;

	// 省略构造器与其他方法
}
 

 

测试用例:

 

Child child = new Child();
child.setName("Tom");
child.setAge(10);

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

 

 

结果:

 

<?xml version="1.0" encoding="UTF-8"?>
<孩子>
    <姓名>Tom</姓名>
    <年龄>10</年龄>
</孩子>
 

 

效果很好,有木有!

 

 

XBlinkOmitField

 

忽略的字段,在字段上设置后,序列化时就会无视他,不解释了。

 

XBlinkAsAttribute


这个应该是XML格式特有的,在一个节点上加上属性。


就用上面那个Child做例子。


修改下:

 

@XBlinkAlias("孩子")
public class Child {

        @XBlinkAlias("姓名")
	@XBlinkAsAttribute
        private String name;

        @XBlinkAlias("年龄")
        private int age;

	// 省略构造器与其他方法
}

 

 

还是那个测试用例,直接看结果:

 

<?xml version="1.0" encoding="UTF-8"?>
<孩子 姓名="Tom">
    <年龄>10</年龄>
</孩子>

 

 

 

—————————邪恶的分割线———————

 

好了,只要你看懂了以上的内容,了解了这5个类的用法,XBlink在使用上90%的问题你已经可以自己解决了,是不是很简单很好用呢。

 

下面将讲解剩下的10%,也就是可以自由扩展的地方。

 

—————————邪恶的分割线———————

 

扩展API

 

一个注解类:XBlinkConverter.java

两个转换器基类:Converter.java SingleValueTypeConverter.java

 

 

XBlinkConverter


在字段上设置后,该字段在序列化时将采用你提供的转换器进行工作。


举个例子哈。


一个日期类型,默认的转换器,生成的格式是 yyyy-MM-dd HH:mm:ss


你希望能使用另一种格式,比如仅需要日期且年在最后位置,格式是MM-dd-yyyy

 

那么你就需要实现一个类,并且继承SingleValueTypeConverter

 

例如下面这样:

 

/**
 * 测试用的一个java.util.Date类型转换器。
 * 
 * @author 胖五(pangwu86@gmail.com)
 */
public class MyDateConverter extends SingleValueTypeConverter {

	private static final String DATA_FORMAT_TEMPLATE = "MM-dd-yyyy";

	public Class<?>[] getTypes() {
		return new Class<?>[] { Date.class };
	}

	public boolean canConvert(Class<?> type) {
		return Date.class == type;
	}

	public String obj2Text(Object obj) throws Exception {
		SimpleDateFormat dateFormat = new SimpleDateFormat(DATA_FORMAT_TEMPLATE);
		return dateFormat.format(obj);
	}

	public Object text2Obj(String text) throws Exception {
		SimpleDateFormat dateFormat = new SimpleDateFormat(DATA_FORMAT_TEMPLATE);
		return dateFormat.parseObject(text);
	}

}

 

这样要说下前面的XBlink.registerConverter这个方法。


如果你仅仅想在某个日期上使用自定义格式,那么就加注解就可以了


如果你觉得默认的你想替换掉,所有有日期的地方都用你的格式,那就调用XBlink.registerConverter,它会根据替换掉默认实现。

 

也就是一个控制局部,一个控制全局,任君调遣。

 

 

Converter 与 SingleValueTypeConverter

 

这两个类,你简单看下估计就会明白了。

 

/**
 * 转换器,提供对象<--->文字相互转换的功能。
 * 
 * 注意,这里只负责两者的转换,不要加入输出等操作。
 * 
 * @author 胖五(pangwu86@gmail.com)
 */
public interface Converter {

	/**
	 * 返回当前转换器可以处理的对象类型。
	 * 
	 * @return class对象
	 */
	public Class<?>[] getTypes();

	/**
	 * 是否可以转换这种类型。
	 * 
	 * @param type
	 *            类类型
	 * @return 能否成功
	 */
	public boolean canConvert(Class<?> type);

	/**
	 * 是单值类型吗?
	 * 
	 * @return 判断结果
	 */
	public boolean isSingleValueType();

	/**
	 * 将对象转换为文字格式的值。
	 * 
	 * @param obj
	 *            转换对象
	 * @throws Exception
	 *             异常
	 * @return 字符结果
	 */
	public String obj2Text(Object obj) throws Exception;

	/**
	 * 将文字格式的值转换为对象。
	 * 
	 * @param text
	 *            文字格式的值
	 * @throws Exception
	 *             异常
	 * @return 对象
	 */
	public Object text2Obj(String text) throws Exception;

}

 

 

/**
 * 单值类型的共同基类。
 * 
 * @author 胖五(pangwu86@gmail.com)
 */
public abstract class SingleValueTypeConverter implements Converter {

	public boolean isSingleValueType() {
		return true;
	}

}

 

再结合下上面的MyDateConverter,相信你一定明白它的作用。


其实本来还提供一个FormValueTypeConverter类,也就是说可以在里面设置格式的转换器,这个更强大,但也更加难以控制,所以当前版本并没有开放出来,等后续版本有了好的解决方案再开放给大家。

 

 

—————————邪恶的分割线———————

以上就是ME现在能想到的基本用法了,基本上遵循着简单易用的原则来搞的,希望大家喜欢。


还有就是什么对象可以进行序列化,由于时间紧,默认提供的转换器还不够全面,所以有些类型会报错,不过如果你看懂了上面的自定义转换器这节,相信你可以自己解决的。


目前的版本,可以序列化java中常见的类(String,Date等),八种基本类型,枚举类型,一维数组(多维暂时不支持),List,Set,Map。


也就是说对简单的应用应该是富富有余了。


其他的想起什么再补充吧,欢迎提问或提出意见。

12
1
分享到:
评论
15 楼 han0917 2013-12-09  
问下把对象某属性A设置为"",即空串,序列化后xml显示为<A />,有没有办法显示成<A></A>
14 楼 Matol 2013-05-04  

初试了一下,还是很惊喜的。毕竟,程序员最清楚自己需要怎样的工具。
同时呢,还发现了一些问题,希望,能够更加完善,也是必备的功能。

1,文件的连缀用法。比如我用该工具将一个objec生成到了xml文件,然后,又用该工具获取到这个xml文件,再次写入另一个object对象。P:需求是写入的新object,追加在已有的xml文件相应节点之下,而不是重新替换了xml文件。

2,xml文件内容中的object对象,toList<Object> 到java

3,

13 楼 riosk 2012-05-30  
楼主:请问是否可以生成如下形式XML.

<?xml version="1.0" encoding="UTF-8"?> 
<姓名>Tom</姓名>
<年龄>10</年龄>

没有了<孩子>
12 楼 riosk 2012-05-30  
// 生成XML文件  
XBlink.toXml(obj);
11 楼 shenldz 2011-11-29  
楼主,您好。

在使用过程中发现一个问题,重现步骤如下:

1、建立两个javabean类:AXmlBean,BXmlBean, 使它们有相同的别名。

2、使用XBlink.registerClassesToBeUsed(Class<?>[])注册这两个类,注册的时候按顺序AXmlBean, BXmlBean。

3、使用XBlink.fromXml(CharSequence),根据String得到AXmlBean。此时会抛NullPointException。

Debug了一下,发现原因是由于AXmlBean,BXmlBean两者的别名相同,所以在注册时,放置类对象的map,由于key值是别名的String,所以对注册多个相同别名的javabean而言,最后注册的在该map中会覆盖掉前面的那些。我现在换成使用方法XBlink.fromXml(CharSequence, Class<?>, Object<?>),每次转换的时候指定被转换的类型。

请问下楼主,这个是我使用不当造成的问题,还是一个需要改进的bug。。。>_<,望答复。

另外,非常感谢楼主编写这个框架,并公开源码。。。祝新年快乐(虽然有点早。。。)
10 楼 鱼乐 2011-10-25  
请问如何闭合标签,
默认生成如下:
<?xml version="1.0" encoding="UTF-8"?>
<孩子 姓名="Tom">
</孩子>

是否可以设置生成如下形式:
<?xml version="1.0" encoding="UTF-8"?>
<孩子 姓名="Tom"/>
9 楼 sourceforge 2011-10-19  
JSON的版本有吗?
8 楼 yin_bp 2011-10-13  
引用
多维暂时不支持


楼主做好还是要支持多维数组啊,毕竟多维数组也是比较常用的数据类型哦,像bboss,xstream都是支持任意类型多维数组序列化/反序列化操作的。另外bboss还能够很好地支持File(二进制文件,文本文件)的序列化\反序列化操作,不知道xblink支持不。
7 楼 pangwu86 2011-10-10  
giianhui 写道
麻烦补充一下下载地址。

请看这里http://www.iteye.com/news/22986
最下面有下载地址
6 楼 giianhui 2011-10-10  
麻烦补充一下下载地址。
5 楼 pangwu86 2011-10-10  
yanweimin7 写道
能否添加将对象序列化为objectoutputstream导出的那样的格式的实现

objectoutputstream的话,定义的对象类必须实现java.io.Serializable接口
也就是JAVA序列化的工作了,跟XBlink的目标不一致。

XBlink序列化的结果,是可以让人阅读的文本格式,非二进制文本。
4 楼 yanweimin7 2011-10-10  
能否添加将对象序列化为objectoutputstream导出的那样的格式的实现
3 楼 pangwu86 2011-10-10  
pangwu86 写道
zozoh 写道
找时间,考虑写个 XIocLoader ......  

啥东东

哦,看明白了,呵呵
2 楼 pangwu86 2011-10-10  
zozoh 写道
找时间,考虑写个 XIocLoader ......  

啥东东
1 楼 zozoh 2011-10-10  
找时间,考虑写个 XIocLoader ......  

相关推荐

    xblink 关键代码

    * XBlink最NB的反序列方法,生成你需要的对象。 * * * 根据docTypeName与其格式特点,进行反序列化生成对象。 * * @param cs * 字符信息 * @param docTypeName * 任意你想要的文档格式...

    XBlink工作流程简介

    NULL 博文链接:https://pangwu86.iteye.com/blog/893887

    基于C/C++开发的单目控制机械臂的上位机程序+视觉识别和关节角反解+源码(高分优秀项目)

    基于C/C++开发的单目控制机械臂的上位机程序+视觉识别和关节角反解+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于C/C++开发的单目控制机械臂的上位机程序+视觉识别和关节角反解+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于C/C++开发的单目控制机械臂的上位机程序+视觉识别和关节角反解+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于C/C++开发的单目控制机械臂的上位机程序+视觉识别和关节角反解+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~

    setuptools-68.2.1-py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    springboot 学生信息管理系统.zip

    学生管理系统是一个典型的基于 Spring Boot 的应用程序,旨在帮助学校、教育机构或培训机构管理学生信息、课程安排、成绩等。下面我将介绍一个简单的学生管理系统的设计和实现,基于 Spring Boot 框架。 功能特点 学生信息管理 添加、编辑、删除学生信息。 查询学生信息,支持按姓名、学号等条件查询。

    setuptools-0.9.8-py2.py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    利用python的pyautogui函数实现简单的自动化操作

    1.安装python3.4以上版本,并配置环境变量(目前有装3.9遇到坑的,我个人用的3.7.6) 教程:https://www.runoob.com/python3/python3-install.html 2.安装依赖包 方法:在cmd中(win+R 输入cmd 回车)输入 pip install pyperclip 回车 pip install xlrd 回车 pip install pyautogui==0.9.50 回车 pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 回车 pip install pillow 回车 这几步如果哪步没成功,请自行百度 如 pip install opencv-python失败 3.把每一步要操作的图标、区域截图保存至本文件夹 png格式(注意如果同屏有多个相同图标,回默认找到最左上的一个,因此怎么截图,截多大的区域,是个学问,如输入框只截中间空白部分肯定是不行的,宗旨就是“唯一”) 4.在cmd.xls 的sheet1 中,配置每一步的指令,如指

    setuptools-38.2.0.zip

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    java毕业设计之鲜花销售网站的设计与实现源码.zip

    毕业设计之鲜花销售网站的设计与实现源码.zip毕业设计之鲜花销售网站的设计与实现源码.zip毕业设计之鲜花销售网站的设计与实现源码.zip毕业设计之鲜花销售网站的设计与实现源码.zip

    药店销售管理系统ssm(药品销售)【说明】资源来源网络以及部分开源社区、仅供参考与学习、项目不可商用、一切后果由使用者承担、若

    药店销售管理系统ssm(药品销售)【说明】资源来源网络以及部分开源社区、仅供参考与学习、项目不可商用、一切后果由使用者承担、若是侵权请联系删除

    JDK1.8 API 中文文档 高清完整版 CHM.zip

    JDK1.8 API 中文文档 高清完整版 CHM

    母亲节快乐python脚本

    母亲节快乐python脚本

    华中科技大学电信专业 课程资料 作业 代码 实验报告-通信电子线路-内含源码和说明书.zip

    华中科技大学电信专业 课程资料 作业 代码 实验报告-通信电子线路-内含源码和说明书.zip

    1999-2022年各省城镇居民人均消费支出数据(无缺失).xls

    1999-2022年各省城镇居民人均消费支出数据(无缺失) 1、时间:1999-2022年 2、来源:国家统计J、统计NJ 3、指标:城镇居民人均消费支出 4、范围:31省 5、缺失情况:无缺失

    setuptools-49.2.1-py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于单片机的电梯程序控制系统.zip

    基于单片机的系统

    setuptools-20.6.8.zip

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    分布式系统课程实验-内含源码和说明书.zip

    分布式系统课程实验-内含源码和说明书.zip

    setuptools-69.0.1-py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    setuptools-49.3.1-py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

Global site tag (gtag.js) - Google Analytics