ปัญหาเกี่ยวกับเรื่องนี้เป็นเพราะฉันพยายามทำให้เป็นอนุกรมวัตถุและเก็บไว้ในไฟล์ XML จากนั้นอ่านสตริงจากไฟล์ XML และ deserialize วัตถุ (โปรแกรม Hadoop MapReduce ถ่ายโอนวัตถุไปยัง TaskTracker ผ่าน JobConf)
เกี่ยวกับการทำให้เป็นอนุกรม:
เมื่อฉันเก็บข้อมูลที่เป็นอนุกรมโดยตรงใน XML ฉันพบข้อผิดพลาดในการแยกวิเคราะห์เมื่อแยกวิเคราะห์ XML เนื่องจากมีอักขระที่ผิดกฎหมาย หลังจากอ่านคำแนะนำของ XML ในรายละเอียดฉันพบว่า <> '"& ไม่ได้รับอนุญาตเป็น XML PCData ในการใช้อักขระเหล่านี้พวกเขาจะต้องถูกแทนที่ด้วยเอนทิตีในตัว:
อักขระใบเสนอราคาเอนทิตี
-
-
-
-
-
ดังนั้นวิธีที่ตรงที่สุดคือการควบคุมด้วยตัวคุณเองแปลงอักขระพิเศษเป็นอ้างอิงเอนทิตีเมื่อเขียนไปยังไฟล์ XML แล้วหันกลับเมื่ออ่าน แน่นอนว่ามีวิธีอื่นที่ไม่ใช้สตริงเป็น pcdata แต่เป็น CDATA (ไม่มีการทดสอบ)
วิธีการใช้การอ้างอิงเอนทิตีนั้นลำบากเกินไปและรูปแบบแอปพลิเคชัน XML ของฉันไม่สามารถระบุได้ด้วยตัวเองดังนั้นฉันต้องหาวิธีอื่น: การเข้ารหัส Base64 นี่เป็นวิธีการเข้ารหัสที่ใช้กันทั่วไปในการส่งข้อมูลบนเครือข่าย หากคุณเข้ารหัสอักขระที่มีอักขระที่ผิดกฎหมายเหล่านี้ลงในการเข้ารหัส Base64 คุณจะไม่มีอักขระเหล่านี้ สิ่งที่สำคัญที่สุดคือตัวเข้ารหัสและตัวถอดรหัสที่เข้ารหัสนั้นมีให้ใน Java API, Base64Encoder และ Base64decoder ที่ตั้งอยู่ใน Sun.misc ด้วยวิธีนี้กระแสไบต์ที่ได้รับหลังจากการทำให้เป็นอนุกรมสามารถแปลงเป็นสตริงได้ และยังสามารถเก็บไว้ในไฟล์ XML
อย่างไรก็ตามสองชั้นเรียนนี้ไม่ใช่ API แบบเปิดของ Sun และจะมีคำเตือนสำหรับการรวบรวม