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

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


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


我的解決方法是,在映射的時(shí)候,用hash map保存一個(gè)class到已知obj列表。不在已知列表里的,就先映射,然后加到已知obj列表里。在已知列表里的,就不再映射了。這樣速度挺快,查找也方便。這個(gè)問(wèn)題還算好解決。
☆接下來(lái)就是垃圾信息的屏蔽。
我是用get*來(lái)映射的(當(dāng)然,集合類型會(huì)有特殊的處理)。
但是,get*方法中赫然有g(shù)etClass存在!而Class類又有一堆get方法!這還算好辦,直接屏蔽掉Class類型好了。
問(wèn)題在于用戶自己的一些無(wú)用信息。比如


















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