توفر Java آلية تسمى التسلسل.
لذلك ، إذا قمنا بتسلسل كائن ، فيمكن قراءته وإلغاء تنشيطه من خلال نوع الكائن والمعلومات الأخرى ، وأخيراً حصل على النموذج الأولي للكائن.
كائنات ObjectInputStream و ObjectOutputStream هي كائنات تدفق عالية المستوى ، بما في ذلك التسلسل والطرق الخلفية.
ObjectoutputStream لديه العديد من الطرق للكائنات المسلسل.
private void writeObject (ObjectOutputStream OS) يلقي IoException {}
يوفر ObjectInputStream الطرق التالية:
العلامة التجارية الخاصة void (ObjectInputStream) يلقي ioException ، classnotfoundException {}
فأين تحتاج إلى التسلسل؟ يستخدم التسلسل عادة بيانات نقل الشبكة ، أو يحفظ الكائنات للملفات. البيانات المذكورة هنا هي كائن وليس نصًا.
المشكلة الآن هي أن بنية الشبكة والقرص الصلب لدينا لا يمكنهم إلا تحديد ثنائي وبايت ، ولا يمكنهم التعرف على كائنات Java.
التسلسل هو ترجمة القيمة/الحالات في كائن Java إلى بايت للنقل أو حفظ عبر الشبكة. بالإضافة إلى ذلك ، فإن التسلسل التبعي هو قراءة رمز البايت وترجمته مرة أخرى إلى كائن Java.
مفهوم SerialVersionuid
يتم استخدام SerialVersionuid لضمان أن يتم تحميل نفس الكائن (الذي يمكن استخدامه في التسلسل) أثناء عملية إزالة التأهيل. SerialVersionuid هو عنصر تحكم الإصدار للكائنات. يمكنك الرجوع إلى SerialVersionuid في تسلسل Java للحصول على مزيد من المعلومات.
للتسلسل:
الخطوات كما يلي:
لنرى قائمة:
إنشاء موظف. java في src-> org.arpit.javapostsforning
1.employee.java
حزمة org.arpit.javapostsforning = effecteeId ؛} السلسلة العامة getEmployeName () {return amperieseeename ؛} public void setemployeename (string exteareEname) {this.employeena me = exteareename ؛} السلسلة العامة getDeppartment () {return department ؛} public void setDepment (string) {this. depapartment = قسم ؛}}
كما ترون ، إذا كنت بحاجة إلى تسلسل أي فصل ، فيجب عليك تنفيذ الواجهة القابلة للتسلسل.
واجهة العلامة في Java هي واجهة بدون أي حقل أو طريقة.
2.Serializemain.java
package org.arpit.javapostsforning ؛ args) {emplude eMP = eMpit () ؛ ser ") ؛ ObjectPutStream OutStream = new ObjectPutStream (fileout) ؛ OutStream.WriteObject (EMP) ؛ OutStream.Close () ؛ استثناء I) {i.printstacktrace () ؛}}}
للظهر -إضفاء الطابع الظهر:
الخطوة
في الحزمة src-> org.arpit.javapostsforlearning ، إنشاء deserializemain.java
3.deserializemain.java
package org.arpit.javapostsforning NULL ؛ ioException i) {i.printstacktrace () ؛ ...) القسم: " + emp.getdeppartment ()) ؛}}
4. الركض:
قم أولاً بتشغيل Serializemain.java ، ثم قم بتشغيل deserializemain.java ، ستحصل على النتائج التالية:
emblayee deserialized ... معرف EMP: 101Name: ArpitDepapartment: CS
وبهذه الطريقة ، قمنا بتسلسل كائن موظف ونفذناه. هذا يبدو بسيطًا ، ولكن إذا كان يحتوي على مراجع كائن وميراث ، فسيصبح الموقف معقدًا. دعونا نلقي نظرة على الأمثلة واحدة تلو الأخرى لنرى كيفية تحقيق التسلسل في مناسبات مختلفة.
الحالة 1 -إذا كان الكائن يقتبس من كائنات أخرى ، فماذا يجب أن أفعل
لقد رأينا بالفعل أبسط الأمثلة المستندة إلى التسلسل. كيف يمكننا التسلسل؟ هل سيقوم الكائن المذكور أيضًا بالتسلسل؟ نعم ، لا تحتاج إلى التسلسل بشكل صريح. عندما تقوم بتسلسل أي كائن ، إذا كان يحتوي على كائنات مرجعية ، فإن تسلسل Java سيقوم تلقائيًا بتسلسل مخطط الكائن بالكامل للكائن. على سبيل المثال ، يقتبس الموظف الآن من كائن العنوان ، ويقتبس العنوان أيضًا كائنات أخرى (على سبيل المثال ، المنزل) ، ثم عندما تقوم بتسلسل كائن الموظف ، سيتم التسلسل تلقائيًا من خلال العنوان والمنزل دعنا ننشئ فئة العنوان ونضيف كائن العنوان كمرجع لإضافته إلى فئة الموظف.
الموظف. جافا:
Package Org.Arpit.javapostsforning. this.employeeId = effecteeId ؛} السلسلة العامة getEmployeename () {return eferenceeeEname ؛} public void setMePoloyeEname (string exteareEname) {this.emplayeename = exerieeName ؛} السلسلة العامة getDePartment () {return department this.department = department ؛} العنوان العام getAddress () {return address ؛} public void setAddress (address) {this.address = address ؛
في حزمة org.arpit.javapostsforlerning ، إنشاء address.java
addr.java:
حزمة org.arpit.javapostsforning هذا .city = city ؛} public int gethomeno () {return homeno ؛} public void sethomeno (int home) {this.homeno = homeno ؛} public StringStstreet () {street ؛} public void setstreet (String Street) {this. Street = Street ؛} سلسلة عامة getCity () {return City ؛} public void setCity (String City) {this.city = city ؛}}
في org.arpit.javapostsforlerning ، قم بإنشاء serializedeserializemain.java
serializedeserializemain.java:
Package Org.Arpit.Javapostsforning ؛ Mandliya */ public static void (args) 88 ، "MG Road" ، "Pune") ؛ Close () ؛} catch (IoException I) {i.printstacktrace () (الموظف) in.reamobject () ؛ الموظف deserialized ... ") ؛ النظام. ) ؛
قم بتشغيله:
عند تشغيل Serializedeserializemain.java. سوف تحصل على مثل هذه النتيجة:
java.io.notserializableException: org.arpit.javapostsforning.address في java.io.objectputTream.writeObject0 (مصدر غير معروف) في java.i o.objectputstream.defaultwritefields (غير معروف) في java.io.oBjectPutTream.WritePata (غير معروف) في java.io.objectputstream.writeordinarinarinarinarible (مصدر غير معروف) في java.io.objectputTream.writeObject0 (مصدر غير معروف) في java.io.ob.ob jectoutputstream.writeObject (مصدر غير معروف)
سنشرح أين هو الخطأ. لقد نسيت أن أقول إن فئة العناوين يجب أن تكون قابلة للتسلسل أيضًا. ثم يجب أن يرث فئة العنوان الواجهة القابلة للسلسلة.
addr.java:
استيراد java.io.serialize .city = city ؛} public int gethomeno () {return homeno ؛} public void sethomeno (int homeno) {this.homeno = homeno ؛} public stringstreet () {) return .street = street ؛} السلسلة العامة getCity () {return city ؛} public void setCity (String City) {this.city = city ؛}}}
الركض مرة أخرى:
عند الركض مرة أخرى serializedeserializemain.java. يمكنك الحصول على النتائج التالية
emblayee deserialized ... معرف EMP: 101Name: ArpitDepartment: CSCITY: Pune
الحالة 2: إذا لم نتمكن من الوصول إلى الكود المصدري للكائن المرجعي (على سبيل المثال ، لا يمكنك الوصول إلى الكود المصدري لفئة العنوان أعلاه)
إذا لم نتمكن من الوصول إلى فئة العناوين ، فكيف يمكننا تنفيذ الواجهة القابلة للتسلسل في فئة العناوين؟ هل هناك طريقة أخرى لتحقيق ذلك؟ نعم ، يمكنك إنشاء فئة أخرى ، ورث العنوان ، ثم اتركه يرث الواجهة القابلة للتسلسل ، ولكن بالنسبة للموقف التالي ، سيفشل هذا الحل:
إذا تم تعريف الفئة المرجعية على أنها النهائي
إذا كانت الفئة المرجعية تشير إلى كائن آخر غير محدد
لذا ، كيف يمكننا تسلسل كائن الموظف؟ الحل هو وضع علامة على الانتقال. إذا لم تكن بحاجة إلى تسلسل أي مجال ، فما عليك سوى تحديدها على أنها عابرة.
عنوان عنوان عابر
في فئة الموظفين ، بعد وضع علامة على العنوان كعابر ، قم بتشغيل البرنامج. سوف تحصل على nullpointerxception ، لأن مرجع العنوان سيكون فارغًا أثناء عملية العميق.
الحالة 3 -ما إذا كنت لا أزال بحاجة إلى حفظ حالة الكائن المرجعي؟ (على سبيل المثال ، كائن العنوان)
إذا قمت بتمييز العنوان على أنه عابر أثناء عملية Deepertine ، فسوف يعيد النتيجة الفارغة. ولكن إذا كنت لا تزال بحاجة إلى حفظ حالتها ، فأنت بحاجة إلى تسلسل كائن العنوان. يوفر التسلسل Java آلية.
الموظف. جافا:
Package.arpit.javapostsforning ؛ العنوان ؛ ؛} السلسلة العامة getDepapartment () {Return Department ؛} public void setDepartment (قسم السلسلة)} العنوان العام getAddress () {return عنوان OS) يلقي ioException ، classnotfoundexception {try {os.defaultWriteObject () ؛ ؛}} private void readObject (ObjectInputStream) .ReadObject () ؛
شيء آخر يجب وضعه في الاعتبار ، يقرأ ObjectInputStream ترتيب البيانات من ObjectOutputStream.
إنشاء address.java
addr.java:
Package Org.Arpit.Javapostsforning ؛ = الشارع ؛ this.street = street ؛} السلسلة العامة getCity () {return City ؛} public void setCity (String City) {this.city = city ؛
إنشاء serializedeserializemain.java
serializedeserializemain.java:
Package Org.Arpit.Javapostsforning ؛ Mandliya */ public static void (args) 88 ، "MG Road" ، "Pune") ؛ Close () ؛} catch (IoException I) {i.printstacktrace () (الموظف) in.reamobject () ؛ الموظف deserialized ... ") ؛ النظام. ) ؛
يجري:
عندما تقوم بتشغيل SerializedeserializeMain.java.
emblayee deserialized ... معرف EMP: 101Name: ArpitDepartment: CSCITY: Pune
الآن نحصل على حالة كائن العنوان ، تمامًا مثله قبل أن يتم تسلسله.
الميراث في التسلسل:
الآن دعونا نرى كيف يؤثر الميراث على التسلسل. بغض النظر عما إذا كانت فئة الوالدين متسلسلة ، فإن هذا سيؤدي إلى العديد من الأمثلة. إذا لم يتم تسلسل فئة الوالدين ، فماذا سنفعل وكيف يعمل. دعونا نلقي نظرة على المثال.
سنقوم بإنشاء شخص. جافا كفئة الوالدين للموظف.
الحالة 4: إذا تم تسلسل فئة الوالدين
إذا تمكنت الطبقة من الأمام من التسلسل ، فسيتم تسلسل جميع فئات الميراث.
الحالة 5: ماذا لو لم يتم تسلسل فئة الوالدين؟
إذا كانت فئة الوالدين غير محددة ، فستكون أساليب المعالجة لدينا مختلفة تمامًا.
إذا كانت الفئة الأصل غير مخصصة ، فلا يجب أن يكون لها وظيفة منشئ المعلمة.
شخص
حزمة org.arpit.javapostsforning Super () ؛ ؛} public void setNationality (سلسلة جنسية) {this.nationality = الجنسية ؛}}
إنشاء الموظف
الموظف. جافا:
Package Org.Arpit.javapostsforning ؛ .employeId = effecteid ؛ Department ؛} public void setDeppartment (قسم السلسلة) {this.deppartment = department ؛}}
إنشاء serializedeserializemain.java
serializedeserializemain.java:
Package Org.Arpit.Javapostsforning ؛ mandliya */public static void main (args) {// serialize emplicee emp = new ameister (101 ، "arpit" ، "Indian") ؛ .println ("emp id:" + emb.getemplyeid ()) ؛ getDeppartment ()) ؛ ) ؛ *********** ") ؛) ؛ ؛ TREE {fileInputStream fileIn = جديد fileInputStream (" exepmitheee.ser ") ؛) in.ReadObject () ؛ in.close () ؛ filein.close () ؛} catch (IoException I) {i.printstacktrace () ؛ (بعد التسلسل ") ؛ "القسم:" + emp.getdeppartment ()) ؛
يجري:
عندما تقوم بتشغيل SerializedEserializemain.java ، ستحصل على الإخراج التالي. هنا ورث اسم شخص ، لذلك خلال عملية العميق ، سيتم تهيئة الاسم إلى القيمة الافتراضية.
الحالة 6 -إذا تم تسلسل الفئة الوالدية ، لكنك لست بحاجة إلى أن ترث الفصل على أنه مسلسل
إذا كنت لا ترغب في أن ترث الفصل للتسلسل ، فأنت بحاجة إلى تنفيذ أساليب WriteObject () و readObject () ، وتحتاج إلى التخلص من شذوذ القابلية للإعجاب.
الحالة 7 -هل يمكن أن تسلسل المتغيرات الثابتة؟
لا يمكن. لأن المتغيرات الثابتة هي مستويات فئة ، وليس مستويات الكائن.
تلخيص: