以前用WebWork的時(shí)候,因?yàn)檫x擇了xml + xslt的方式,所以就要把object映射到xml。
最初想偷偷懶,不打算使用配置文件。于是就自己寫了一個(gè)obj2xml,遇到了兩個(gè)問題:
☆首先就是環(huán)的問題。
xml是樹形結(jié)構(gòu),不允許出現(xiàn)環(huán)的。而對象關(guān)系中,很容易出現(xiàn)環(huán)。比如
Parent.getChildren();
Child.getParent();這樣的代碼。
我的解決方法是,在映射的時(shí)候,用hash map保存一個(gè)class到已知obj列表。不在已知列表里的,就先映射,然后加到已知obj列表里。在已知列表里的,就不再映射了。這樣速度挺快,查找也方便。這個(gè)問題還算好解決。
☆接下來就是垃圾信息的屏蔽。
我是用get*來映射的(當(dāng)然,集合類型會(huì)有特殊的處理)。
但是,get*方法中赫然有g(shù)etClass存在!而Class類又有一堆get方法!這還算好辦,直接屏蔽掉Class類型好了。
問題在于用戶自己的一些無用信息。比如
DomainObject.getXXXService();
XXXServiceImpl.getYYYDAO();
YYYDAO.getZZZDAOSupport();還有就是多余的信息。比如我只想得到用戶的基本信息,可是

class?Person?
{
????getName();
????getAge();
????getBirthday();
????getEducationRecord();
}


class?EducationRecord
{
????getMildSchool();
????getUnivercity();
}這樣一來,本來不需要的教育的信息就會(huì)被映射到。由于Person對象可能會(huì)關(guān)聯(lián)到很多對象,那樣就會(huì)有很多無用的信息被包含進(jìn)來。
對于這種情況,首先的想法就是LazyLoading。對于一般的使用,這是沒有問題的。但是我的需求是要把XML發(fā)送到客戶端。客戶端會(huì)使用XML中的哪些數(shù)據(jù),我的映射程序沒有辦法捕捉到。因此LazyLoading就毫無用武之地了。
沒有辦法,只能把責(zé)任推倒對被映射的object,讓它注意不要包含無用的數(shù)據(jù)。可是這樣一來,就要專門為映射準(zhǔn)備一些bean,然后用BeanUtil給他們賦值,再傳遞給obj2xml。
最后實(shí)在沒有辦法,干脆徹底拋棄我的obj2xml,自己寫了一個(gè)xmlResult,使用vm來生成xml。
雖然為需要寫一些vm,但是比起專門準(zhǔn)備一堆bean再用obj2xml映射,還是要簡單直接一些。
可能這也是沒有什么特別好用的obj/xml映射工具的原因吧!