ในการโทรระยะไกลพารามิเตอร์และค่าส่งคืนจะต้องส่งผ่านเครือข่าย การใช้งานนี้ต้องการการทำให้เป็นอนุกรมเพื่อแปลงวัตถุเป็นสตรีมไบต์จากนั้น deserialize กลับเข้าไปในวัตถุจากปลายด้านหนึ่งไปอีกด้านหนึ่ง
เนื่องจากมีบทความก่อนหน้านี้ที่กล่าวถึง Hessian ที่นี่เราจะพูดคุยสั้น ๆ เกี่ยวกับความแตกต่างระหว่าง Java Serialization และ Hessian Serialization
ก่อนอื่นการทำให้เป็นอนุกรม Hessian นั้นมีประสิทธิภาพมากกว่าการทำให้เป็นอนุกรม Java และกระแสไบต์ที่สร้างขึ้นนั้นสั้นกว่ามาก แต่ค่อนข้างพูดการทำให้เป็นอนุกรม Java ไม่น่าเชื่อถือและไม่ครอบคลุมเท่าการสนับสนุนการทำให้เป็นอนุกรม Java เหตุผลสำหรับความแตกต่างดังกล่าวคือดูการใช้งานของพวกเขา
มาพูดคุยเกี่ยวกับการทำให้เป็นอนุกรม Java ก่อน ฉันจะไม่พูดถึงหลักการทำงานที่เฉพาะเจาะจง Java serialization จะทำให้ข้อมูลเมตาและข้อมูลทางธุรกิจของคลาสวัตถุได้รับการจัดลำดับจากกระแสไบต์และจะทำให้ทุกสิ่งในความสัมพันธ์การสืบทอดทั้งหมด สตรีมไบต์ที่เป็นอนุกรมเป็นคำอธิบายที่สมบูรณ์ของโครงสร้างวัตถุไปยังเนื้อหาที่มีข้อมูลทั้งหมดดังนั้นจึงมีประสิทธิภาพน้อยกว่าและสตรีมไบต์ค่อนข้างใหญ่ แต่เนื่องจากทุกอย่างมีความเป็นอนุกรมแน่นอนอาจกล่าวได้ว่าทุกอย่างสามารถถ่ายโอนได้ดังนั้นจึงสามารถใช้งานได้และเชื่อถือได้มากขึ้น
สำหรับการทำให้เป็นอนุกรมของ Hessian กลไกการใช้งานคือการมุ่งเน้นไปที่ข้อมูลและมาพร้อมกับข้อมูลประเภทง่ายๆ เช่นเดียวกับจำนวนเต็ม A = 1, Hessian จะทำให้เป็นอนุกรมเป็นสตรีมเช่นฉัน 1 ฉันแสดงถึง int หรือจำนวนเต็มและ 1 คือเนื้อหาข้อมูล สำหรับวัตถุที่ซับซ้อนผ่านกลไกการสะท้อน Java, Hessian serializes คุณสมบัติทั้งหมดของวัตถุเป็นแผนที่ผลิตสตรีมเช่น M className PropertyName1 I 1 PropertyName S StringValue (อาจลืมมันไป) ซึ่งมีคำอธิบายประเภทพื้นฐานและเนื้อหาข้อมูล ในระหว่างกระบวนการทำให้เป็นอนุกรมหากวัตถุปรากฏขึ้นก่อนหน้านี้ Hessian จะแทรกบล็อกโดยตรงเช่นดัชนี R เพื่อแสดงตำแหน่งอ้างอิงดังนั้นจึงกำจัดเวลาของการทำให้เป็นอนุกรมและ deserialization อีกครั้ง ราคาของการทำเช่นนี้คือ Hessian ต้องการจัดการประเภทต่าง ๆ ที่แตกต่างกัน (ดังนั้น Hessian จึงขี้เกียจและไม่สนับสนุนสั้น ๆ ) และเขายังต้องจัดการกับการปฏิบัติการพิเศษเมื่อพบกับวัตถุพิเศษบางอย่าง (เช่น StackTraceElement) และในเวลาเดียวกันเพราะมันไม่ได้ลึกเข้าไปในการดำเนินการเพื่อดำเนินการอนุกรมจะมีความไม่สอดคล้องกันบางอย่างในบางโอกาสเช่นแผนที่ที่ได้รับผ่านคอลเลกชัน SynchronizedMap
การทำให้เป็นอนุกรมหมายถึงการทำให้เป็นอนุกรมวัตถุในสตรีมไบต์เพื่อการจัดเก็บที่ง่ายหรือส่งเครือข่าย ในขณะที่ Deserialization เป็นสิ่งที่ตรงกันข้ามการแปลงสตรีมไบต์กลับไปเป็นวัตถุ สิ่งที่เรามักใช้คือวิธีการทำให้เป็นอนุกรม Hessian และวิธีการทำให้เป็นอนุกรม Java ประสิทธิภาพและขนาดการทำให้เป็นอนุกรมของวิธีการทำให้เป็นอนุกรมทั้งสองนั้นแตกต่างกัน ตัดสินจากผลการทดสอบ Hessian ดีกว่า นี่คือตัวอย่างการทำให้เป็นอนุกรม Hessian (ไม่มีไฟล์ IO และเครือข่าย IO, การทำให้เป็นอนุกรมบริสุทธิ์และ deserialization):
/** * การทำให้เป็นอนุกรม Hessian บริสุทธิ์ * @param Object * @return * @throws Exception */public Static byte [] serialize (วัตถุวัตถุ) โยนข้อยกเว้น {ถ้า (วัตถุ == null) {โยน nullpointerexception ใหม่ (); HessianserializerOutput (OS); HessianOutput.writeObject (Object); return OS.tobyTearray ();}/** * Hessian deserialization บริสุทธิ์ * @param bytes * @return * @throws ยกเว้น */วัตถุคงที่สาธารณะ nullpointerexception ();} byteArrayInputStream คือ = ใหม่ byteArrayInputStream (ไบต์); HessianserializerInput HessianInput = ใหม่ HessianserializerInput (IS); Object Object = HessianInput.ReadObject ();อีกวิธีทั่วไปคือการทำให้เป็นอนุกรม Java:
/** * java serialization * @param obj * @return * @throws Exception */public Static byte [] serialize (Object obj) โยนข้อยกเว้น {ถ้า (obj == null) โยน nullpointerexception ใหม่ (); ObjectOutputStream (OS); out.writeObject (obj); return os.tobytearray ();}/** * java deserialization * @param โดย * @return * @throws Exception */วัตถุสาธารณะคงที่ ByteArrayInputStream (BY); ObjectInputStream ใน = New ObjectInputStream (IS); return in.readObject ();}ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น