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

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


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