JavaRush /จาวาบล็อก /Random-TH /เหตุใดจึงต้องใช้ SerialVersionUID ภายในคลาส Serializable ...
0xFF
ระดับ
Донецк

เหตุใดจึงต้องใช้ SerialVersionUID ภายในคลาส Serializable ใน Java

เผยแพร่ในกลุ่ม
SerializationและSerialVersionUIDยังคงเป็นปริศนาสำหรับนักพัฒนา Java จำนวนมากเสมอ ฉันมักจะเห็นคำถามเกี่ยวกับ what is SerialVersionUIDหรือจะเกิดอะไรขึ้นหากฉันไม่ประกาศSerialVersionUIDในSerializable-class? เหตุใดจึงใช้ SerialVersionUID ภายในคลาส Serializable ใน Java - 1นอกเหนือจากความสับสนและไม่ค่อยได้ใช้ อีกเหตุผลหนึ่งสำหรับคำถามนี้ก็คือ Eclipse IDE ไม่มีคำเตือนSerialVersionUIDตัวอย่างเช่น: " คลาส Serializable ลูกค้าไม่ได้ประกาศฟิลด์ SerialVersionUID สุดท้ายแบบคงSerializableที่CustomerประเภทSerialVersionUIDlong " ในบทความนี้ คุณจะไม่เพียงแต่เรียนรู้พื้นฐานของ Java เท่านั้นSerialVersionUIDแต่ยังรวมถึงผลกระทบต่อกระบวนการซีเรียลไลซ์และดีซีเรียลไลซ์ด้วย เมื่อคุณประกาศคลาส โดยSerializableใช้อินเทอร์เฟซโทเค็นjava.io.Serializableรันไทม์ของ Java จะจัดเก็บอินสแตนซ์ของคลาสนั้นไว้บนดิสก์โดยใช้กลไกการทำให้เป็นอนุกรมเริ่มต้น เว้นแต่คุณจะกำหนดค่ากระบวนการให้ใช้อินเทอร์เฟซภายนอกได้ ในระหว่างการทำให้เป็นอนุกรม รันไทม์ Java จะสร้างหมายเลขเวอร์ชันสำหรับคลาสเพื่อให้สามารถดีซีเรียลไลซ์ได้ในภายหลัง ใน Java หมายเลขเวอร์ชันนี้เรียกว่าSerialVersionUID. หากในระหว่างการดีซีเรียลไลเซชันไม่มีSerialVersionUIDการจับคู่ กระบวนการจะออกโดยมีข้อยกเว้นInvalidClassExceptionในสตรีม " main" java.io.InvalidClassExceptionและจะพิมพ์ชื่อคลาสและชื่อที่เกี่ยวข้องด้วย SerialVersionUIDวิธีแก้ไขปัญหาอย่างรวดเร็วคือการคัดลอกSerialVersionUIDและกำหนดให้เป็นค่าคงที่ประเภทprivate static final longในชั้นเรียนของคุณ ในบทความนี้ เราจะเรียนรู้ว่าทำไมเราจึงควรใช้SerialVersionUIDใน Java และวิธีใช้เครื่องมือ Serialver JDK เพื่อสร้าง ID นี้ หากคุณยังใหม่กับการทำให้เป็นอนุกรม คุณสามารถดูคำถามสัมภาษณ์การทำให้เป็นอนุกรมของ Java 10 อันดับแรกได้ เพื่อประเมินความรู้ของคุณและค้นหาช่องว่างในความเข้าใจของคุณสำหรับการอ่านเพิ่มเติม Like Concurrency(เห็นพ้องต้องกัน) และMulti-threading(multithreading), Serialization(serialization) เป็นอีกหัวข้อหนึ่งที่สมควรอ่านหลายครั้ง

เหตุใดจึงต้องใช้ SerialVersionUID ใน Java

อย่างที่ผมบอกไป เมื่อเรายังไม่ได้กำหนดค่าSerialVersionUIDเหมือนstatic final longในคลาสของเรา กลไกการทำให้ซีเรียลไลซ์จะทำแทนเรา กลไกนี้ไวต่อรายละเอียดมากมาย รวมถึงฟิลด์ของคลาสของคุณ ตัวแก้ไขการเข้าถึง อินเทอร์เฟซที่นำไปใช้ และแม้แต่การใช้งานคอมไพเลอร์ที่แตกต่างกัน การเปลี่ยนแปลงใด ๆ ในคลาสหรือการใช้คอมไพเลอร์อื่นอาจทำให้เกิดผลลัพธ์ที่แตกต่างออกไปSerialVersionUIDซึ่งท้ายที่สุดแล้ว หยุดข้อมูลซีเรียลไลซ์ไม่ให้โหลดซ้ำ มีความเสี่ยงที่จะต้องใช้กลไกการทำให้ซีเรียลไลซ์ของ Java เพื่อสร้างรหัสนี้ ซึ่งเป็นเหตุผลว่าทำไมจึงเป็นความคิดที่ดีที่จะกำหนดอย่างชัดเจนSerialVersionUIDในคลาส Serializableของ คุณ ฉันขอแนะนำให้อ่าน Java classic - Joshua Bloch “Effective Java”เพื่อทำความเข้าใจการทำให้เป็นอนุกรมของ Java และปัญหาในการจัดการอย่างไม่ถูกต้อง อย่างไรก็ตาม JDK ยังมี tool serialverที่อยู่ใน ไดเร็กทอรี bin ของ ไดเร็กทอรีJAVA_HOMEบนคอมพิวเตอร์ของฉันC:\Program Files\Java\jdk1.6.0_26\bin\serialver.exeซึ่งสามารถใช้ในการสร้างSerialVersionUIDสำหรับชั้นเรียนเก่า สิ่งนี้มีประโยชน์มากในกรณีที่คุณทำการเปลี่ยนแปลงคลาสของคุณที่ทำให้การทำให้ซีเรียลไลซ์ไม่ทำงาน และแอปพลิเคชันของคุณไม่สามารถโหลดอินสแตนซ์ซีเรียลไลซ์ซ้ำได้ คุณสามารถใช้ยูทิลิตีนี้เพื่อสร้างSerialVersionUIDอินสแตนซ์เก่าได้อย่างง่ายดาย จากนั้นใช้งานอย่างชัดเจนโดยการประกาศฟิลด์นี้เป็นprivate static สุดท้าย long SerialVersionUIDอย่างไรก็ตาม ขอแนะนำอย่างยิ่งด้วยเหตุผลด้านประสิทธิภาพและความปลอดภัยในการใช้รูปแบบไบนารีปกติสำหรับซีเรียลไลซ์ อีกครั้ง “Effective Java” มีหลายย่อหน้าที่แสดงข้อดีของรูปแบบปกติโดยละเอียด

วิธีใช้ยูทิลิตี้ serialver JDK เพื่อสร้าง SerialVersionUID

คุณสามารถใช้serialverเพื่อสร้างSerialVersionUIDคลาสได้ สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับการพัฒนาคลาส ยูทิลิตี้นี้ส่งคืนSerialVersionUIDในรูปแบบที่คัดลอกง่าย คุณสามารถใช้serialverยูทิลิตี JDK ดังแสดงในตัวอย่าง:
$ serialver
use: serialver [-classpath classpath] [-show] [classname...]
$ serialver -classpath . Hello
Class Hello is not Serializable.
$ serialver -classpath . Hello
Hello: static final long SerialVersionUID = -4862926644813433707L;
คุณยังสามารถใช้ยูทิลิตีserialverเป็นGUIคำสั่งได้$ serialver –showซึ่งจะเป็นการเปิดตัวตรวจสอบserial versionซึ่งใช้ชื่อคลาสเต็มและแสดงSerial versionผล

สรุป

ตอนนี้เรารู้แล้วว่ามันคืออะไรSerialVersionUIDและเหตุใดจึงสำคัญที่จะต้องประกาศมันในSerializableคลาส - ถึงเวลาที่จะทบทวนข้อเท็จจริงที่สำคัญบางประการที่เกี่ยวข้องกับ Java SerialVersionUID
  1. SerialVersionUIDใช้เพื่อระบุเวอร์ชันของข้อมูลที่ต่อเนื่องกัน

  2. เมื่อเราไม่ประกาศSerialVersionUIDในคลาสของเรา รันไทม์ของ Java จะทำสิ่งนั้นให้เรา แต่กระบวนการนี้ไวต่อเมตาดาต้าจำนวนมากของคลาส รวมถึงจำนวนฟิลด์ ประเภทของฟิลด์ ตัวดัดแปลงการเข้าถึงฟิลด์ อินเทอร์เฟซที่นำไปใช้ในคลาส ฯลฯ คุณสามารถค้นหาข้อมูลที่แน่นอนได้ในเอกสารการทำให้เป็นอนุกรมจาก Oracle

  3. ขอแนะนำให้ประกาศ SerialVersionUID เป็นตัวแปรแบบยาวสุดท้ายแบบคงที่ส่วนตัวเพื่อหลีกเลี่ยงกลไกเริ่มต้น IDE บางตัว เช่นEclipseยังออกคำเตือนหากคุณลืมสิ่งนี้ เช่น: "ลูกค้าคลาส Serializable ไม่ได้ประกาศฟิลด์ประเภท SerialVersionUID สุดท้ายแบบคงที่แบบยาว" แม้ว่าคุณจะสามารถปิดใช้งานคำเตือนนี้ได้โดยไปที่ Window > การตั้งค่า > Java > คอมไพเลอร์ > ข้อผิดพลาด/คำเตือน > ปัญหาการเขียนโปรแกรมที่อาจเกิดขึ้น ฉันขอแนะนำว่าอย่าทำเช่นนั้น เมื่อไม่จำเป็นต้องกู้คืนข้อมูลเท่านั้น ฉันจึงจะประมาทได้ นี่คือลักษณะของข้อผิดพลาดนี้ใน Eclipse IDE สิ่งที่คุณต้องทำคือตัดสินใจอย่างรวดเร็วในครั้งแรก เหตุใดจึงใช้ SerialVersionUID ภายในคลาส Serializable ใน Java - 2

  4. คุณยังสามารถใช้ยูทิลิตี serialver จาก JDK เพื่อสร้าง Serial Version สำหรับคลาสใน Java ยูทิลิตี้นี้ยังมี GUI ซึ่งเปิดใช้งานเมื่อส่งพารามิเตอร์show-

  5. แนวทางปฏิบัติที่ดีที่สุดในการทำให้ซีเรียลไลซ์คือการประกาศอย่างชัดเจนSerialVersionUIDเพื่อหลีกเลี่ยงปัญหาใดๆ กับการดีซีเรียลไลซ์ โดยเฉพาะอย่างยิ่งหากคุณกำลังทำงานกับแอปพลิเคชันไคลเอนต์-เซิร์ฟเวอร์ที่ต้องอาศัยข้อมูลซีเรียลไลซ์ เช่น RMI
มันคือทั้งหมดที่เกี่ยวกับSerialVersionUIDใน Java ตอนนี้เรารู้แล้วว่าทำไมการประกาศให้ถูกต้องSerialVersionUIDในชั้นเรียน จึงเป็นเรื่องสำคัญ คุณสามารถขอบคุณ IDE ของคุณสำหรับการแจ้งเตือนนี้ ซึ่งอาจทำให้การยกเลิกการซีเรียลไลซ์ของชั้นเรียนของคุณเสียหายได้ หากคุณต้องการอ่านเพิ่มเติมเกี่ยวกับการทำให้เป็นอนุกรมและแนวคิดที่เกี่ยวข้อง คุณสามารถดูบทความดีๆ เหล่านี้ได้ ต้นฉบับที่นี่
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION