引言

  由于最近的工作写代码比较少,这让LZ产生了一丝危机感。于是便想找一个办法可以没事自己写写代码,自然而然就想到了github。接下来便是一阵捣鼓的过程,其实整个过程很快,主要过程就是注册一个账号,然后创建自己的仓库。看着自己空荡荡的仓库,LZ就想着放上去一些自己平时写的东西,不过仔细一翻才发现,自己平时写的代码都是一片一片的,几乎没有完整的项目或者代码。

  平时LZ写博客的时候会写不少代码,尤其是当初在写设计模式系列的时候,代码更是堆积如山。不过可惜的是,由于这个系列有时候是LZ在家用自己的电脑写的,有时候是在公司的时候用公司的电脑写的,而且有时候是写好了复制到博客上就可能删掉或者覆盖了,于是就造成代码的分割和不完整,看起来零零碎碎的。

  想到这里,LZ就更坚定了使用github的决心,其它不说,它至少可以当做自己的SVN仓库。这样的话,如果以后再写代码,就不用担心代码的零零碎碎,又或者是干脆丢失找不到了,这些代码虽然不是什么好东西,但对自己来说,其实也代表着当时的思考,有时候对自己还是很有用的。

基于Java的xml和object转换工具

  其实Java当中,现在已经有了JAXB这个关于xml和object的转换工具,当时LZ写这个工具的时候,主要是因为JAXB不是JDK1.5自带的,导入的jar包相对较多也较大,功能虽然强大但却不实用。因为我们公司的需求很简单,只需要一个十分简单的转换就可以,于是当时LZ就自己写了一个简单的转换工具,并称之为simple-xml2object,首发于LZ的CSDN老博客,这个小工具还给LZ赚了不少下载积分,呵呵。

  不过当时没公开源码,很大的原因是因为,LZ觉得这个工具主要是提供简单的转换功能,如果单纯从源码上来看的话,实在没有什么亮点。不过现在想法有点不一样了,不管是好代码烂代码,只要是自己亲手写的,就有其保存的价值。而且有了github,这种保存十分方便,既然如此,为何不保存呢?LZ想不出理由拒绝这种好处,当然了,如果有人能在github上提提意见,改善改善这个工具,那LZ更是求之不得了。

xxoo的诞生

  现在simple-xml2object在github上正式更名为xxoo,并采用apacheV2开源协议。说起这个名字的来历,还是比较偶然的,昨晚LZ在github创建这个项目的时候,总觉得simple-xml2object这个名字太长了,因此LZ刚开始其实是想叫x2o或者o2x,但又仔细一看这两个转换的缩写,这不就是两个x和两个o吗,于是秉承着“简单,好记”的原则,一个名为xxoo的转换工具就这么产生了。

  总而言之,言而总之,xxoo就是一个简单的Java版的xml和object转换的工具,并没有任何高深的东西,因此LZ这里就不再多说废话了,直接上源码的相关地址和一些相关的简单示例。

  1、SVN地址:https://github.com/xiaolongzuo/xxoo

  2、SSH地址:git@github.com:xiaolongzuo/xxoo.git

  以下是项目的简单目录,其中演示的示例LZ放在了test目录当中,各位如果在SVN里检出源码,可以先看一下里面的示例。

  在test包当中,有一个类专门写的是xxoo的示例代码,也算是xxoo的一般使用方式,它的具体代码如下。

package cn.zxl.xxoo.test;

import java.io.IOException;

import cn.zxl.xxoo.container.ConfigurableContainer;
import cn.zxl.xxoo.container.Container;
import cn.zxl.xxoo.processor.XmlBulider;
import cn.zxl.xxoo.processor.XmlBulider.Format;
import cn.zxl.xxoo.support.DefaultConfigurableContainer; public class Transfer { public static void main(String[] args) throws IOException {
//测试不可配置的容器
useUnconfigurableContainer("E:/test1.xml");
//测试可配置的容器
useConfigurableContainer("E:/test2.xml");
} public static void useUnconfigurableContainer(String path) throws IOException{
//不可配置的容器
Container container = new DefaultConfigurableContainer(Object.class);
//向容器中添加一个复杂的Test对象
container.add(Object.createObject());
//获取容器自动解析的xml内容
String xml = container.getXml();
//将xml内容存放在一个文件中
FileUtils.write(path, xml);
} public static void useConfigurableContainer(String path) throws IOException{
//可配置的容器,使用可配置的容器接口,推荐此种方式,比较灵活
ConfigurableContainer configurableContainer = new DefaultConfigurableContainer(Object.class);
XmlBulider xmlBulider = configurableContainer.getXmlBulider();
//设置构建器的xml格式
xmlBulider.setFormat(Format.TAB_AND_LINE);
//改变容器中的构建器
configurableContainer.setXmlBulider(xmlBulider);
//向可配置容器添加复杂对象
configurableContainer.add(Object.createObject());
//获取容器自动解析的xml内容,比较下不能配置的容器构建的xml格式和日期格式
String configXml = configurableContainer.getXml(0);//等同于getXml()
//将xml内容存放在一个文件中
FileUtils.write(path, configXml); /* --------------------------------- */ //再将xml从test2.xml中读取出来
String readableConfigXml = FileUtils.read(path);
//向容器中再加入一个xml
configurableContainer.add(readableConfigXml);
//获取容器自动解析的对象
//因为之前已经加入了一个对象,所以在加入xml之前,容器中已包含一对xml和object,此时索引为1
//容器维护了两个保持一致的数组,分别存放xml和object,索引规则与数组一致,从0开始
Object test = configurableContainer.getObject(1);
//打印容器大小
System.out.println("size:" + configurableContainer.size());
//打印解析的对象,打印的可能不太清楚
//要想打印格式清晰,与我当初构建xml时相似,过程比较复杂,就不写那么详细了,各位可以自己加断点看对象内容
System.out.println(test);
} }

  以下是一个xxoo工具生成的XML,算是一个简单的演示吧,各位也可以自己试试。

<?xml version="1.0" encoding="UTF-8"?>
<Object>
<stringParam>stringValue</stringParam>
<dateParam>2013-11-09 03</dateParam>
<testParam>
<stringParam>stringValue</stringParam>
<dateParam>2013-11-09 03</dateParam>
<testParam>
<stringParam>stringValue</stringParam>
<dateParam>2013-11-09 03</dateParam>
<testParam>
<stringParam>stringValue</stringParam>
<dateParam>2013-11-09 03</dateParam>
</testParam>
<testListParam>
<Object>
<stringParam>stringValue</stringParam>
<dateParam>2013-11-09 03</dateParam>
<testListParam>
<Object>
<stringParam>stringValue</stringParam>
<dateParam>2013-11-09 03</dateParam>
</Object>
<Object>
<stringParam>stringValue</stringParam>
<dateParam>2013-11-09 03</dateParam>
</Object>
</testListParam>
</Object>
<Object>
<stringParam>stringValue</stringParam>
<dateParam>2013-11-09 03</dateParam>
</Object>
<Object>
<stringParam>stringValue</stringParam>
<dateParam>2013-11-09 03</dateParam>
</Object>
<Object>
<stringParam>stringValue</stringParam>
<dateParam>2013-11-09 03</dateParam>
</Object>
<Object>
<stringParam>stringValue</stringParam>
<dateParam>2013-11-09 03</dateParam>
</Object>
</testListParam>
</testParam>
</testParam>
</Object>

  上述XML文件基于下面这样一个测试使用的Object类,代码如下。

public class Object implements Serializable{

    private static final long serialVersionUID = 1L;

    private String stringParam = "stringValue";

    @ADate(format = "yyyy-MM-dd hh")//日期注解,设置日期格式
private Date dateParam = new Date(); private Object testParam; private List<Object> testListParam; }

  上面省略了get/set方法,其中的ADate是一个注解,可以定义日期在xml中的格式,这四个属性都是无意义的属性,各位不要纠结于这个,它们仅仅是为了测试。当然了,LZ个人的测试力度其实非常不足,不过基本的功能肯定是可以的,因为它可能已经被一小部分人在使用(CSDN下载次数75,囧),LZ当然就是其中一个。不过这其中难免会有一些隐藏的bug,这就看各位的火眼金睛够不够亮了,睁大你的17K氪金近视眼来挑LZ的bug吧,LZ将感激不尽。

  

用后感

  第一次使用github来保管代码,感觉还是十分不错的,决定以后就用它了。最可惜的就是,当时那24个设计模式的代码没有整理到github上面去,LZ悔之不及啊。如果哪位猿友也在为自己平时的代码保存发愁,那就不要再犹豫了,赶紧踏上github的路途吧。

第一次玩github,第一个开源小项目——xxoo的更多相关文章

  1. [同步到 MaixPy3 文档] 使用 Python 编程入门开源硬件项目

    本文是给有一点 Python 基础但还想进一步深入的同学,有经验的开发者建议跳过. 前言 在写这篇案例系列的时候 junhuanchen 期望能够引导用户如何成为专业的开发者,不是只会调用代码就好,所 ...

  2. [Angularjs] 第一步开始一个项目

    [Angularjs] 第一步开始一个项目 一.什么是angularjs angularjs是2009年兴起的,目前由Google维护一个采用mvc模式的js框架,很多时候用来创建单页面应用.我也经常 ...

  3. GitHub 优秀Android 开源项目

    阅读目录 1.Xabber客户端 2.oschina客户端 3.手机安全管家 4.星座连萌 5.玲闹铃 6.魔乐盒 7.PWP日历 8.Apollo音乐播放器 9.夏普名片识别 10.高仿人人网 11 ...

  4. 28款GitHub最流行的开源机器学习项目,推荐GitHub上10 个开源深度学习框架

    20 个顶尖的 Python 机器学习开源项目 机器学习 2015-06-08 22:44:30 发布 您的评价: 0.0 收藏 1收藏 我们在Github上的贡献者和提交者之中检查了用Python语 ...

  5. 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳

    学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 ...

  6. 聊聊第一个开源项目(内网穿透) - CProxy

    文章首发:聊聊第一个开源项目 - CProxy 作者:会玩code 初衷 最近在学C++,想写个项目练练手.对网络比较感兴趣,之前使用过ngrok(GO版本的内网穿透项目),看了部分源码,想把自己的一 ...

  7. 我的第一个开源项目-logger4Net

    学会学习,学会分享,学会创造. 这我的第一个开源项目.以前总觉得开源离自己很远,但通过不断学习发现,其实自己已经走在这条路上.思想就在那,只要懂得学习,懂得分享,就会懂享受创造的快乐感与殷实感. 没做 ...

  8. Github 上 Star 最多的个人 Spring Boot 开源学习项目

    2016年,在一次技术调研的过程中认识到了 Spring Boot ,试用之后便一发不可收拾的爱上它.为了防止学习之后忘记,就在网上连载了 Spring Boot 系列文章,没想到这一开始便与 Spr ...

  9. Fragment为载体可自己主动布局的CardView(GitHub上写开源项目初体验)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 前些天一直在看Android5.0 的Material Desgin,里面新增 ...

随机推荐

  1. Linux--面试题-01

    1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文件用 i节点 来标识. 4. ...

  2. 多个Firefox共存&&彻底关闭自动更新

    安装 0x001 下载好要安装Firefox的版本 可到Firefox官方仓库下载 https://ftp.mozilla.org/pub/firefox/releases/ 我下载的是42和56版 ...

  3. Mysql 漏洞利用(越权读取文件,实战怎么从低权限拿到root密码)[转]

    cnrstar (Be My Personal Best!) | 2014-05-20 21:58 众所周知,Mysql的用户在没有File权限情况下是无法通过Load_file读文件或者通过into ...

  4. 前端技术-HTML页面的加载

    HTML页面的加载 HTML页面的加载实际上是基于http过程+浏览器对数据的解析渲染. http协议的请求过程是基于TCP协议的.http是要基于TCP连接基础上,简单的说,TCP单纯建立连接,不涉 ...

  5. Django 自定义模板标签和过滤器

    1.创建一个模板库 使用模板过滤器的时候,直接把过滤器写在app里,例如:在app里新建一个templatetags的文件夹,这个目录应当和 models.py . views.py 等处于同一层次. ...

  6. C语言利用 void 类型指针实现面向对象类概念与抽象。

    不使用C++时,很多C语言新手可能认为C语言缺乏了面向对象和抽象性,事实上,C语言通过某种组合方式,可以间接性的实现面对对象和抽象. 不过多态和继承这种实现,就有点小麻烦,但是依然可以实现. 核心: ...

  7. Hadoop学习之路(十四)MapReduce的核心运行机制

    概述 一个完整的 MapReduce 程序在分布式运行时有两类实例进程: 1.MRAppMaster:负责整个程序的过程调度及状态协调 2.Yarnchild:负责 map 阶段的整个数据处理流程 3 ...

  8. jenkins pipeline 配置

    pipeline { agent any stages { stage('Checkout') { steps { echo 'Checkout' checkout([$class: 'GitSCM' ...

  9. openfalcon-0.2 配置

    hbs 配置文件 { "debug": true, "database": "openfalcon:123456@tcp(172.16.230.188 ...

  10. pl/sql连接远程oracle

    1.找到oracle安装程序下的网络配置助手 2.选中本地net服务,进行添加 3.输入远程oracle服务名 4.选中tcp协议 5.输入远程oracle的ip地址 6.在网络服务名处,随便输入一个 ...