`
pangwu86
  • 浏览: 116328 次
  • 性别: 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

    ASP某书店图书销售管理系统的设计与实现(源代码+论文)【ASP】.zip

    ASP某书店图书销售管理系统的设计与实现(源代码+论文)【ASP】

    施工混凝土配合比动态管理台账(新样板版).xls

    施工混凝土配合比动态管理台账(新样板版).xls

    Lua移植到标准ANSI C环境

    Lua移植到标准ANSI C环境

    施工混凝土配合比动态管理台账.docx

    施工混凝土配合比动态管理台账.docx

    TwinCAT3 入门教程 V4.11

    TwinCAT3 入门教程 V4.11

    基于Python开发的快递管理系统-课程设计

    【作品名称】:基于Python开发的快递管理系统-课程设计 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:使用Python开发的课程设计,快递管理系统。课程设计

    基于WEB的教师信息管理系统设计

    信息化以它自身的优点,方便、快捷、进入了各行各业。教育行业也是如此。由于高校不断的扩大管理,教师人工管理已经越来越不能满足学校的需求。人工管理信息,管理纸质档案变成了落后的管理方式。不方便、难以保存、不容易查找这些种种缺点都督促着高校信息化的发展。高校对于教师工作采用信息管理系统是急需的。 本文从相关技术分析、系统需求分析、数据库需求分析确定了系统重要功能模块的实现。实现主要功能模块包括人员信息模块、评价教师模块、教师工作日程管理模块、科研信息申报模块等。 在Windows环境下,本管理信息系统使用visual studio开发工具。编写程序过程用到了Asp.Net技术。编写程序采用B/S架构,webform框架,连接数据库方式采用当下主流技术使用SQL Server。最后,通过多次反复的测试,确定各项功能实现的稳定性。

    H3C实验概述及应用.pdf

    H3C实验概述及应用 一、实验概述 H3C实验是网络工程领域中的一项重要实践活动,旨在通过模拟或实际部署H3C网络设备,让学生或网络工程师深入了解H3C网络设备的配置、管理及应用。这些实验不仅有助于提升网络工程师的技术水平,还能够为企业的网络建设和管理提供有力支持。 H3C实验通常包括以下几个方面: 1.设备连接与基础配置:学习如何正确连接H3C网络设备,并进行基本的配置,如IP地址设置、VLAN划分等。 2.路由与交换技术:掌握H3C路由器和交换机的配置与管理,包括静态路由、动态路由协议(如OSPF、BGP等)、VLAN间路由等。 3.安全技术:了解H3C网络安全设备的配置与管理,如防火墙、VPN、入侵检测与防御等。 4.无线技术:熟悉H3C无线接入点(AP)和无线控制器的配置与管理,掌握WLAN网络的规划与部署。 5.网络管理与优化:学习使用H3C网络管理系统(如iMC)对网络设备进行监控、故障排查和性能优化。 二、实验应用 H3C实验在网络工程领域具有广泛的应用,以下是一些具体的应用场景: 1.教育培训:H3C实验是网络工程专业学生的重要实践课程,通过实验操作,学生能够更好地理解

    整站程序三雷11种语言建站系统(网络版) v6.0-30tnetwork

    php-[整站程序]三雷11种语言建站系统(网络版) v6.0_30tnetwork

    VBA聚光灯效果工具箱.xlsm

    VBA聚光灯效果工具箱.xlsm 跟wps聚光灯差不多 可设置聚光灯0.5毫秒消失,可以自定义设置时间

    中国生物医药行业市场前景及投资研究报告

    中国生物医药行业市场前景及投资研究报告

    啊哈算法哈磊第四节再解炸弹人BFS算法(java)

    本资源深入解析了《啊哈算法》一书中的经典案例——第四节“再解炸弹人问题”,通过Java语言实现了BFS(广度优先搜索)算法的详细过程。本资源不仅涵盖了理论基础,详细阐述了BFS算法原理及其在解决“炸弹人”游戏策略中的应用,还提供了高质量的Java代码实现,每行代码均有详尽注释,便于读者理解和实践。无论是算法初学者想要掌握BFS算法精髓,还是有一定基础的开发者希望提升编程技巧,这份资料都能提供极大的帮助。立即下载,跟随教程一步步揭开“炸弹人”问题的面纱,提升你的算法思维与Java编程能力!

    开车不犯困100首MP3,之51-60,DJ.rar

    开车不犯困100首MP3,之51-60,DJ.rar

    【思维模型】查理·芒格推荐的100个思维模型.pptx

    【思维模型】查理·芒格推荐的100个思维模型.pptx

    Buffer of Thoughts: Thought-Augmented Reasoning with Large Langu

    Buffer of Thoughts: Thought-Augmented Reasoning with Large Language ModelsBuffer of Thoughts: Thought-Augmented Reasoning with Large Language ModelsBuffer of Thoughts: Thought-Augmented Reasoning with Large Language ModelsBuffer of Thoughts: Thought-Augmented Reasoning with Large Language ModelsBuffer of Thoughts: Thought-Augmented Reasoning with Large Language ModelsBuffer of Thoughts: Thought-Augmented Reasoning with Large Language ModelsBuffer of Thoughts: Thought-Augmented Reasoning with Lar

    跨国经营与管理第九章全球化企业的跨文化管理.pptx

    跨国经营与管理第九章全球化企业的跨文化管理.pptx

    苹果CMS高仿迅影网主题模板

    一款苹果CMS8X高仿迅影网主题模板,已测试,完美无错。苹果cmsV8版本,只有电脑端,不自适应手机端。模板只包含首页、列表、内容页、播放页。

    前端开发基础入门教程 JavaScript语言编程基础教程 第5章 JS实战 共16页.pptx

    【学习目标】: 图片幻灯 复杂的表单验证 瀑布流

Global site tag (gtag.js) - Google Analytics