للأسف ، على الرغم من أنني على دراية بجافا ، إلا أنني لا أعرف الكثير من معرفة Java الأساسية. على سبيل المثال ، لم أستخدم الكلمة الرئيسية العابرة من قبل ، لذلك لا أعرف ما هي وظيفتها. عندما كنت أجري الاختبار الكتابي اليوم ، وجدت أن هناك سؤالًا حول هذا الموضوع ، لذلك قضيت وقتًا في فرز استخدام الكلمات الرئيسية العابرة ورفع وضعي ~~~ حسنًا ، لن أقول الكثير من الهراء ، لنبدأ:
1. دور واستخدام طريقة عابرة <br /> نعلم جميعًا أنه طالما أن الكائن ينفذ الواجهة المثيرة ، يمكن تسلسل الكائن. يوفر نموذج التسلسل هذا في 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 */public class transienttest {public static void main (string [] args) {user user = new user () ؛ 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 */public class transienttest {public static void main (string [] args) {user user = new user () ؛ 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 ، يمكن تنفيذ تسلسل الكائن عن طريق تنفيذ واجهتين. إذا تم تنفيذ الواجهة التسلسلية ، فسيتم تنفيذ جميع التسلسل تلقائيًا. إذا تم تنفيذ الواجهة الخارجية ، لا يمكن التسلسل تلقائيًا. تحتاج إلى تحديد المتغير يدويًا ليتم تسلسله في طريقة الكتابة الجنسية ، والذي لا علاقة له بما إذا كان يتم تعديله عن طريق عابرة. لذلك ، يخرج المثال الثاني المحتوى الذي تم تهيئته بواسطة المحتوى المتغير ، وليس فارغًا.
المؤلف: أليكسيا (مينمين)
إذا كنت ترغب في التواصل والتفاعل معي ، فيرجى الاتصال بنا على Weibo: http://www.cnblogs.com/lanxuezaipiao/p/3369962.html
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.