遇到這一方面的問題是因為我試圖把一個對象序列化之後存貯到xml文件中,然後從xml文件中讀取字符串,並反序列化對象(hadoop mapreduce程序中通過JobConf向tasktracker傳送對象)。
有關序列化:
當我把序列化之後的數據直接存在xml中後,在解析xml時遇到解析錯誤,原因是有非法字符。在詳細閱讀xml的說明之後才發現:< > ' " &是不允許作為xml的PCDATA的。要使用這幾個字符,必須要把他們替換為內建實體:
實體引用字符
< <
> >
& &
"
' '
所以,最直接的方法就是自己控制,在寫入xml文件時把特殊字符轉為實體引用,在讀取的時候,再轉回來。當然還有另外一個方法就是不把字符串當PCDATA,而是當成CDATA來使用(沒有測試)。
用實體引用的方法太麻煩,而我的應用xml的格式不能自己規定,所以只好尋找另外的方法:BASE64編碼。這是一種常用在網絡傳輸數據的編碼方式。把存在這些非法字符的字符編碼成base64編碼,就不會有這些字符了。最重要的是java api中提供了這種編碼的編碼器和解碼器,位於sun.misc的BASE64Encoder和BASE64Decoder。這樣就可以把序列化之後得到的字節流轉化成字符串了。並且也可以存貯在xml文件中。
不過這兩個類並不是sun的開放api,編譯會有警告。