كلمات رئيسية عابرة جافا
1. وظيفة واستخدام العابر
نعلم جميعًا أنه طالما أن الكائن ينفذ الواجهة المسلحة ، يمكن تسلسل الكائن. يوفر نموذج التسلسل هذا في Java الكثير من الراحة للمطورين. ليس علينا أن نتعلق بعملية التسلسل المحددة. طالما أن هذه الفئة تنفذ الواجهة المثيرة ، سيتم تلقائيا جميع خصائص وطرق هذه الفئة تلقائيًا.
ومع ذلك ، في عملية التطوير الفعلية ، نواجه هذه المشكلات غالبًا. تحتاج بعض خصائص هذه الفئة إلى التسلسل ، في حين أن الخصائص الأخرى لا تحتاج إلى التسلسل. على سبيل المثال ، إذا كان لدى المستخدم بعض المعلومات الحساسة (مثل كلمات المرور ، وأرقام البطاقات المصرفية ، وما إلى ذلك) ، لأسباب أمنية ، فإنه لا يريد أن يتم نقله في عمليات الشبكة (التي تنطوي بشكل رئيسي على عمليات التسلسل ، يمكن أيضًا تطبيق ذاكرة التخزين المؤقت للتسلسل المحلي) ، ويمكن إضافة المتغيرات المقابلة لهذه المعلومات مع الكلمات الرئيسية العابرة. وبعبارة أخرى ، فإن دورة حياة هذا الحقل هي فقط في ذاكرة المتصل ولا يتم كتابتها إلى القرص من أجل الثبات.
باختصار ، توفر لنا الكلمة الرئيسية العابرة لجافا الراحة. تحتاج فقط إلى تنفيذ الواجهة المسلحة وإضافة الكلمة الرئيسية عابرة قبل السمات التي لا تحتاج إلى التسلسل. عند تسلسل الكائن ، لن يتم تسلسل هذه السمة إلى الوجهة المحددة.
رمز المثال هو كما يلي:
استيراد java.io.fileInputStream ؛ استيراد java.io.filenotfoundException ؛ استيراد java.io.fileOutputStream ؛ استيراد java.io.ioException ؛ استيراد java.io.oBjectInputStream ؛ eSrage java.Objectouttream ؛ import java.serializable ؛ لاحظ أنه عند القراءة ، يجب أن يكون ترتيب قراءة البيانات متسقًا مع ترتيب تخزين البيانات * * author Alexia * date 2013-10-15 * http://www.manongjc.com/article/1609 user.setUserName ("Alexia") ؛ user.setPasswd ("123456") ؛ System.out.println ("اقرأ قبل التسلسل:") ؛ System.out.println ("username:" + user.getuserName ()) ؛ System.Err.println ("كلمة المرور:" + user.getPasswd ()) ؛ حاول {ObjectOutputStream OS = جديد ObjectOutputStream (FileOutputStream جديد ("C: /user.txt")) ؛ OS.WriteObject (المستخدم) ؛ // اكتب كائن المستخدم في الملف os.flush () ؛ OS.Close () ؛ } catch (fileNotFoundException e) {e.printStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } try {ObjectInputStream is = new ObjectInputStream (جديد fileInputStream ("c: /user.txt")) ؛ user = (user) iS.ReadObject () ؛ // اقرأ بيانات المستخدم من الدفق IS.Close () ؛ System.out.println ("/nread بعد التسلسل:") ؛ System.out.println ("username:" + user.getuserName ()) ؛ System.Err.println ("كلمة المرور:" + user.getPasswd ()) ؛ } catch (fileNotFoundException e) {e.printStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } catch (classNotFoundException e) {E.PrintStackTrace () ؛ }}} مستخدم فئة ينفذ serializable {private static Final Long SerialVersionuid = 8294180014912103005L ؛ اسم المستخدم الخاص بالسلسلة الخاصة ؛ سلسلة عابرة خاصة passwd ؛ السلسلة العامة getUserName () {return username ؛ } public void setusername (string username) {this.userName = username ؛ } السلسلة العامة getPasswd () {return passwd ؛ } public void setPasswd (String passwd) {this.passwd = passwd ؛ }}الإخراج هو:
اقرأ قبل التسلسل: اسم المستخدم: AlexiaPassword: 123456Read بعد التسلسل: اسم المستخدم: AlexiaPassword: NULL
حقل كلمة المرور فارغ ، مما يعني أنه لم يتم الحصول على أي معلومات من الملف أثناء التخلص.
2. ملخص الاستخدام العابر
1) بمجرد تعديل المتغير عن طريق عابرة ، لن يكون المتغير جزءًا من ثبات الكائن ، ولا يمكن الوصول إلى محتويات المتغير بعد التسلسل.
2) يمكن للكلمة الرئيسية العابرة تعديل المتغيرات فقط ، ولكن ليس الأساليب والفئات. لاحظ أنه لا يمكن تعديل المتغيرات المحلية عن طريق الكلمات الرئيسية العابرة. إذا كان المتغير هو متغير فئة محدد من قبل المستخدم ، فيجب على الفئة تنفيذ الواجهة القابلة للتسلسل.
3) لا يمكن تسلسل المتغيرات التي تم تعديلها بواسطة الكلمة الرئيسية العابرة. لا يمكن التسلسل المتغير الثابت بغض النظر عما إذا كان يتم تعديله عن طريق عابرة.
قد تكون النقطة الثالثة مربكة ، لأنني وجدت أنه بعد إضافة الكلمة الأساسية الثابتة إلى حقل اسم المستخدم في فئة المستخدم ، تظل نتيجة تشغيل البرنامج دون تغيير ، أي أن اسم المستخدم للنوع الثابت يتم قراءة "Alexia". أليس هذا متناقضًا للنقطة الثالثة؟ في الواقع ، يبدو الأمر كذلك: النقطة الثالثة صحيحة بالفعل (لا يمكن التسلسل المتغير الثابت بغض النظر عما إذا كان يتم تعديله بواسطة عابرة). بعد التخلص من التسلسل ، يكون اسم المستخدم للمتغير الثابت في الفئة هو قيمة المتغير الثابت المقابل في JVM الحالي. هذه القيمة غير مستمدة من إلغاء التسلسل في JVM. لا تصدق ذلك؟ حسنًا ، دعني أثبت ذلك أدناه:
استيراد java.io.fileInputStream ؛ استيراد java.io.filenotfoundException ؛ استيراد java.io.fileOutputStream ؛ استيراد java.io.ioException ؛ استيراد java.io.oBjectInputStream ؛ eSrage java.Objectouttream ؛ import java.serializable ؛ لاحظ أنه عند القراءة ، يجب أن يكون ترتيب قراءة البيانات متسقًا مع ترتيب تخزين البيانات * * author Alexia * date 2013-10-15 * http://www.manongjc.com */الفئة العامة transientTest {public static void main (string) {مستخدم مستخدم جديد () ؛ user.setUserName ("Alexia") ؛ user.setPasswd ("123456") ؛ System.out.println ("اقرأ قبل التسلسل:") ؛ System.out.println ("username:" + user.getuserName ()) ؛ System.Err.println ("كلمة المرور:" + user.getPasswd ()) ؛ حاول {ObjectOutputStream OS = جديد ObjectOutputStream (FileOutputStream جديد ("C: /user.txt")) ؛ OS.WriteObject (المستخدم) ؛ // اكتب كائن المستخدم في الملف os.flush () ؛ OS.Close () ؛ } catch (fileNotFoundException e) {e.printStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } حاول {// تغيير قيمة اسم المستخدم قبل deserialization user.username = "jmwang" ؛ ObjectInputStream = جديد ObjectInputStream (جديد fileInputStream ("C: /user.txt")) ؛ user = (user) iS.ReadObject () ؛ // اقرأ بيانات المستخدم من الدفق IS.Close () ؛ System.out.println ("/nread بعد التسلسل:") ؛ System.out.println ("username:" + user.getuserName ()) ؛ System.Err.println ("كلمة المرور:" + user.getPasswd ()) ؛ } catch (fileNotFoundException e) {e.printStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } catch (classNotFoundException e) {E.PrintStackTrace () ؛ }}} مستخدم فئة ينفذ serializable {private static Final Long SerialVersionuid = 8294180014912103005L ؛ اسم مستخدم السلسلة الثابتة العامة ؛ سلسلة عابرة خاصة passwd ؛ السلسلة العامة getUserName () {return username ؛ } public void setusername (string username) {this.userName = username ؛ } السلسلة العامة getPasswd () {return passwd ؛ } public void setPasswd (String passwd) {this.passwd = passwd ؛ }}نتيجة العملية هي:
اقرأ قبل التسلسل: اسم المستخدم: AlexiaPassword: 123456Read بعد التسلسل: اسم المستخدم: Jmwangpassword: NULL
هذا يعني أن قيمة اسم المستخدم للمتغير الثابت في الفئة غير المرغوب فيها هي قيمة المتغير الثابت المقابل في JVM الحالي ، وهو JMwang المعدل ، وليس القيمة Alexia أثناء التسلسل.
3. تفاصيل الاستخدام العابر - هل يمكن تعديل المتغيرات التي تم تعديلها بواسطة الكلمة الرئيسية العابرة التسلسلية؟
فكر في الأمثلة التالية:
استيراد java.io.externalizable ؛ استيراد java.io.file ؛ استيراد java.io.fileinputStream ؛ استيراد java.io.fileOutputStream ؛ استيراد java.ioexcept date 2013-10-15 * */public Class ExternalizableTest تنفذ keveralizable {private transient string content = "نعم ، سأتم تسلسلها بغض النظر عما إذا تم تعديلها بواسطة الكلمة الرئيسية العابرة أم لا" ؛ Override public void writeextern (Objectoutput) يلقي ioException {out.writeObject (content) ؛ } Override public void readexternal (ObjectInput in) يلقي ioException ، classNotFoundException {content = (string) in.ReadObject () ؛ } static void main (string [] args) يلقي الاستثناء {externalizableTest et = new externalizableTest () ؛ ObjectOutput Out = new ObjectOutputStream (FileOutputStream جديد (ملف جديد ("اختبار")))) ؛ out.writeObject (et) ؛ ObjectInput in = new ObjectInputStream (FileInputStream جديد (ملف جديد ("اختبار")))) ؛ et = (externalizableTest) in.ReadObject () ؛ system.out.println (et.content) ؛ out.close () ؛ in.close () ؛ }}هل سيتم تسلسل متغير المحتوى؟ حسنًا ، لقد أخرجت جميع الإجابات ، نعم ، والنتيجة هي:
نعم ، سوف يتم التسلسل ، بغض النظر عما إذا كنت قد تم تعديلها من خلال الكلمة الرئيسية العابرة أم لا
لماذا هذا؟ ألم يقال أن متغيرات الفصل لن يتم تسلسلها بعد تعديلها بواسطة الكلمة الرئيسية العابرة؟
نحن نعلم أنه في Java ، يمكن تنفيذ تسلسل الكائن عن طريق تنفيذ واجهتين. إذا تم تنفيذ الواجهة التسلسلية ، فسيتم تنفيذ جميع التسلسل تلقائيًا. إذا تم تنفيذ الواجهة الخارجية ، لا يمكن التسلسل تلقائيًا. تحتاج إلى تحديد المتغير يدويًا ليتم تسلسله في طريقة الكتابة الجنسية ، والذي لا علاقة له بما إذا كان يتم تعديله عن طريق عابرة. لذلك ، يخرج المثال الثاني المحتوى الذي تم تهيئته بواسطة المحتوى المتغير ، وليس فارغًا.
شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!