引言
由於最近的工作寫代碼比較少,這讓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的路途吧。
