معرفة متقدمة جافا التسلسل

مقدمة

جافا الكائنات تسلسل كملفات الثنائية جافا التسلسل هو تقنية جافا سلسلة التكنولوجيا في الناحية الفنية أكثر أهمية، في معظم الحالات، ومطوري تحتاج فقط إلى معرفة تسلسل احتياجات فئة لتطبيق واجهة للتسلسل، استخدم ObjectInputStream وObjectOutputStream القراءة والكتابة الكائن. ومع ذلك، في بعض الحالات، معرفة الخفيفة ليست كافية، نقل المقال عن عدد من الحالات من واقع الحياة واجهت، فإنها ترتبط مع جافا التسلسل، عن طريق تحليل أسباب الحالات تنشأ، لكي يتمكن القراء تبقي بسهولة في الاعتبار جافا التسلسل بعض كبار التفاهم.

بنية المادة

وستكون ورقة إدخال بعض الحالات، مثل ترتيب القائمة التالية.

  • قضية التسلسل ID
  • المتغيرات ثابتة التسلسل
  • التسلسل الفئة الأصل وعابر الكلمة
  • لتشفير المجالات الحساسة
  • تسلسل القواعد المخزنة

كل جزء من قائمة يحكي قصة حالة واحدة، يمكن للقراء الاطلاع على التوالي.

قضية التسلسل ID

السياق : اثنان من عملاء ألف ومحاولة B بالمرور عبر شبكة البيانات الهدف، A تسلسل محطة الكائن C ثم مرت إلى البيانات الثنائية B، B إلغاء التسلسل C. لإعطاء

مشكلة : من المفترض جميع C مسار فئة الكائن إلى com.inout.Test، ومحطات A و B لديها مثل ملف فئة لذلك، رمز وظيفة هو نفسه تماما. أيضا تطبيق واجهة للتسلسل، ولكن فشل إلغاء التسلسل دائما.

حل : يسمح الجهاز الظاهري لإلغاء تسلسل، لا يعتمد فقط على تطابق مسار الطبقة وظيفة رموز، وهذه نقطة مهمة جدا هي ما إذا كان اثنين تسلسل الطبقات ID متناسقة (وهذا هو، ساكنة الخاص نهائي طويلة serialVersionUID = 1L) . في قائمة 1، على الرغم من فئتين من التعليمات البرمجية وظيفة نفس بالضبط، ولكن تسلسل ID مختلف، فإنها لا تستطيع متبادل التسلسل واجتثاث التسلسل.

1. مقارنة بين فئات مختلفة قائمة بنفس وظيفة من تسلسل رمز هوية

حزمة com.inout.

استيراد java.io.Serializable.

الطبقة العامة وتنفذ تسلسل {

 خاص ثابت نهائي طويلة serialVersionUID = 1L.

 اسم سلسلة الخاص؛

 جمهور سلسلة getName ()

 {

 عودة الاسم؛

 }

 setName باطلة العامة (اسم سلسلة)

 {

 this.name = الاسم؛

 }

}

حزمة com.inout.

استيراد java.io.Serializable.

الطبقة العامة وتنفذ تسلسل {

 خاص ثابت نهائي طويلة serialVersionUID = 2L.

 اسم سلسلة الخاص؛

 جمهور سلسلة getName ()

 {

 عودة الاسم؛

 }

 setName باطلة العامة (اسم سلسلة)

 {

 this.name = الاسم؛

 }

}

قدمت التسلسل ID الكسوف على اثنين من استراتيجية الجيل، واحدة ثابتة و1L، وبشكل عشوائي هو البيانات تكرار غير نوع طويل (أدوات JDK المستخدمة فعليا لتوليد)، حيث كان هناك اقتراح، إذا أي متطلبات خاصة ، هو استخدام الافتراضي 1L يمكن، لذلك يمكنك التأكد من أن الرمز هو ثابت عند إلغاء التسلسل النجاح. ثم تتابع بشكل عشوائي من ID لها أي دور في ذلك، في بعض الحالات، عن طريق تغيير تسلسل ID يمكن استخدامها لتقييد بعض المستخدمين.

يتميز حالة استخدام

يجب أن يكون سمع القراء وضع الواجهة، فإنه يوفر واجهة وصول موحدة لتطبيق البرنامج، في حالة برنامج العميل عميل ويستخدم هذا الوضع، وهيكل برنامج للقضية هو مبين في الشكل (1).

هيكل البرنامج حالة 1. FIG

محطة العميل يمكن أن تتفاعل مع الكائنات منطق الأعمال من خلال كائن الواجهة. كائن اجهة العميل لا يتم إنشاء مباشرة من قبل العميل، من جانب الخادم ولكن الحاجة إلى توليد، وتسلسل بيانات كائن ثنائي ينتقل خلال العميل الشبكة، وإلغاء تسلسل مسؤولة العميل الكائنات التي تم الحصول عليها الواجهة. قد يكون هذا الوضع بحيث الترخيص اللازم لاستخدام برنامج خادم العميل، وعلى الرغم من خادم العميل الواجهة كائن من الدرجة يجب أن تكون هي نفسها. عند إنشاء الملقم الذي تريد التحديث إلى الإصدار، طالما أن تسلسل خادم ID الواجهة الطبقة كائن مرة أخرى، عندما ستفشل العميل اجتثاث التسلسل الواجهة كائن، وهو إلزامي للحصول على أحدث برنامج من جانب العميل من جانب الخادم.

المتغيرات ثابتة التسلسل

السياق : عرض التعليمات البرمجية في قائمة 2.

القائمة 2. ثابت تسلسل متغير من التعليمات البرمجية في السؤال

فئة العمومي اختبار الأدوات تسلسل {

 خاص ثابت نهائي طويلة serialVersionUID = 1L.

 ثابت الجمهور الباحث staticVar = 5؛

 ساكنة العام باطلة الرئيسية (سلسلة وسائط) {

 محاولة {

 عندما staticVar الأولية // 5

 ObjectOutputStream خارج = ObjectOutputStream الجديد (

 جديد FileOutputStream ( "result.obj"))؛

 out.writeObject (اختبار جديد ())؛

 out.close ()؛

 // تسلسل معدلة من 10

 Test.staticVar = 10؛

 ObjectInputStream oin = ObjectInputStream جديدة (فيلينبوتستريام الجديد (

 "Result.obj"))؛

 اختبار ر = (اختبار) oin.readObject ()؛

 oin.close ()؛

 // قراءة إعادة، طباعة قيمة جديدة من t.staticVar

 System.out.println (t.staticVar)؛

 } صيد (FileNotFoundException ه) {

 e.printStackTrace ()؛

 } صيد (IOException ه) {

 e.printStackTrace ()؛

 } صيد (ClassNotFoundException ه) {

 e.printStackTrace ()؛

 }

 }

}

قائمة 2 هو الأسلوب الرئيسي، وتسلسل الأشياء، تغيير قيمة متغير ثابت، ثم تلا تسلسل من الكائنات، ويحصل على قيمة متغير ثابت من قبل الكائن تلا وطباعتها. وفقا للقائمة 2، وإخراج System.out.println (t.staticVar) البيان هو 10 أو 5 ذلك؟

الناتج النهائي هو 10، لا يمكن فهم للقارئ التفكير، ويتم الحصول على staticVar طباعة من الموضوع قراءة، والدولة يجب أن يتم حفظها عندما الأسماك. السبب هو أن سلسلة من طباعة 10، لا يتم حفظ المتغيرات ثابتة، بل هو في الواقع أسهل للفهم، التسلسل هو حالة الحفاظ على هدف والمتغيرات الثابتة العائدة للدولة من الدرجة، لذلك التسلسل لا يحفظ المتغيرات ثابتة .

التسلسل الفئة الأصل وعابر الكلمة

السياق : A فئة فرعية الأدوات واجهة للتسلسل، والطبقة الأم لا تنفذ واجهة للتسلسل، تسلسل الكائن فئة فرعية، ثم قيمة الانتاج متغير تعريف الفئة الأصل بعد إلغاء التسلسل، والقيمة التي قيم المتغيرات وتسلسل مختلفة.

حل : لوتسلسل أيضا الكائن الأصل، ونحن بحاجة للسماح الفئة الأصل أيضا بتنفيذ تسلسل . إذا لم الوالد يتحقق، فمن تحتاج إلى أن يكون التقصير لا حجة منشئ . عندما الفئة الأصل لا تنفذ واجهة للتسلسل، هي آلة افتراضية لن يتم تسلسل طفل من الكائن الأصل، وبناء كائن جافا يجب أن يكون الكائن الأصل، فقط، دي-التسلسل ليست استثناء. إلغاء التسلسل لذلك، الكائن الأصل من أجل بناء، وليس فقط استدعاء المعلمة منشئ الفئة الأصل كما الكائن الأصل الافتراضي. وهكذا، عندما نأخذ قيمة المتغير الأم، قيمتها لا استدعاء قيم المعلمات منشئ الفئة الأصل. إذا كنت تنظر في ملابسات هذا التسلسل، والمتغيرات لا حجة منشئ تهيئة في الفئة الأصل، وإلا، فإن قيم متغير فئة الأم هي القيم الافتراضية أعلن كنوع كثافة العمليات من الافتراضية هي 0، اكتب سلسلة من الافتراضي ومن فارغة.

دور مفتاح عابر هو تسلسل متغيرات التحكم، بالإضافة إلى الكلمة قبل إعلان متغير، ويمنع وتسلسل المتغير إلى الملف، بعد أن تسلسل مكافحة قيمة المتغير عابرة من المقرر أن قيمة أولية، ونوع int هو 0، نوع الكائن فارغة.

يتميز حالة استخدام

ونحن على دراية استخدام كلمات يمكن أن تجعل الحقول عابر لا يتم تسلسل، ثم هناك طرق أخرى؟ تسلسل الوالد حكم كائن الفئة، ونحن قد لا تحتاج إلى إجراء تسلسل مجال استخراج في الفئة الأصل، وتنفذ فرعية واجهات للتسلسل، وليس قواعد تنفيذ الفئة الأصل وفقا للتسلسل الأم، حقل البيانات الفئة الأصل لن يتم تسلسل، ويتم تشكيل الطبقة هو مبين في الشكل 2.

الرسم البياني الشكل 2. حالة من الدرجة

ويمكن أن يرى الشكل أعلاه، ATTR1، ATTR2، attr3، لن يتم إجراء تسلسل attr5، في أن فوائد الفئة الأصل عندما يكون هناك فئة الأطفال، ATTR1، ATTR2، attr3 آخر لا يزال غير متسلسلة، وليس تكرار وصف عابرة، رمز موجزة.

لتشفير المجالات الحساسة

السياق : ملقم إلى كائن العميل بيانات تسلسل انتقال، وهناك بعض البيانات كائن حساس، مثل سلسلة كلمة المرور في حقل كلمة المرور الأمل خلال التسلسل، مشفرة، وإذا كان العميل لديه مفتاح فك التشفير، إلغاء تسلسل فقط على جانب العميل، يمكننا أن نقرأ كلمة السر، حتى تتمكن من ضمان درجة معينة من بيانات السلامة تسلسل الكائنات.

حل : في عملية التسلسل، ويحاول الجهاز الظاهري لاستدعاء فئة الكائن من writeObject وreadObject الأسلوب المستخدم التسلسل واجتثاث التسلسل المحدد، إذا لم يكن هناك مثل هذا الأسلوب، والدعوة الافتراضية هي طريقة defaultWriteObject من ObjectOutputStream وObjectInputStream من defaultReadObject الأسلوب. طرق writeObject وreadObject المعرفة من قبل المستخدم قد تسمح للمستخدم التحكم في تسلسل العملية، مثل يمكن تغيير حيوي تسلسل القيم في تسلسل العملية. واستنادا إلى هذا المبدأ، يمكن استخدامه في التطبيقات العملية، وتستخدم لتشفير المجالات الحساسة من العمل، قائمة 3 عروض هذه العملية.

قائمة 3. ثابت تسلسل متغير من التعليمات البرمجية في السؤال

خاص ثابت نهائي طويلة serialVersionUID = 1L.

 كلمة سلسلة خاصة = "تمرير".

 جمهور سلسلة getPassword () {

 عودة كلمة المرور.

 }

 setPassword الفراغ الجمهور (كلمة سلسلة) {

 this.password = كلمة السر،

 }

 writeObject باطلة الخاص (ObjectOutputStream الخروج) {

 محاولة {

 PutField putFields = out.putFields ()؛

 System.out.println ( "كلمة السر القديمة:" + كلمة المرور).

 كلمة المرور = "التشفير"؛ // التشفير التناظرية

 putFields.put ( "كلمة السر"، كلمة المرور)؛

 System.out.println ( "كلمة مرور مشفرة" كلمة السر +)؛

 out.writeFields ()؛

 } صيد (IOException ه) {

 e.printStackTrace ()؛

 }

 }

 readObject باطلة الخاص (ObjectInputStream في) {

 محاولة {

 GetField readFields = in.readFields ()؛

 كائن كائن = readFields.get ( "كلمة السر"، "")؛

 System.out.println ( "فك تشفير السلسلة:" + object.toString ())؛

 كلمة المرور = "تمرير"؛ // فك التشفير التناظرية، والاحتياجات الأساسية للحصول على المحلي

 } صيد (IOException ه) {

 e.printStackTrace ()؛

 } صيد (ClassNotFoundException ه) {

 e.printStackTrace ()؛

 }

 }

 ساكنة العام باطلة الرئيسية (سلسلة وسائط) {

 محاولة {

 ObjectOutputStream خارج = ObjectOutputStream الجديد (

 جديد FileOutputStream ( "result.obj"))؛

 out.writeObject (اختبار جديد ())؛

 out.close ()؛

 ObjectInputStream oin = ObjectInputStream جديدة (فيلينبوتستريام الجديد (

 "Result.obj"))؛

 اختبار ر = (اختبار) oin.readObject ()؛

 System.out.println ( "سلسلة غير مشفرة:" + t.getPassword ())؛

 oin.close ()؛

 } صيد (FileNotFoundException ه) {

 e.printStackTrace ()؛

 } صيد (IOException ه) {

 e.printStackTrace ()؛

 } صيد (ClassNotFoundException ه) {

 e.printStackTrace ()؛

 }

 }

طريقة WriteObject في قائمة 3، يتم تشفير كلمات السر، وكلمة السر لفك تشفير readObject، ليس لديها سوى العميل الرئيسي، يمكننا تحليل الخروج كلمة المرور الصحيحة لضمان أمن البيانات. أداء وحدة قائمة الناتج هو مبين في الشكل. 3 بعد 3.

الشكل 3. تشفير البيانات تجريبي

يتميز حالة استخدام

والتكنولوجيا RMI يستند كليا على تقنية التسلسل جافا، المعلمات دعوة خادم واجهة الكائن حاجة إلى اعتبار العميل، وانتقالها إلى بعضها البعض عبر الشبكة. وهذا ينطوي على نقل آمن للقضية RMI. بعض المجالات الحساسة، مثل اسم المستخدم وكلمة المرور (مطلوب بكلمة المرور عند تسجيل دخول المستخدمين نقل)، ونحن نريد أن تكون مشفرة، ثم، إلى الطريقة الموضحة في هذا القسم تشفير كلمة المرور يمكن استخدامها على جانب العميل، ويفك شفرة الخادم لضمان أمن نقل البيانات.

تسلسل القواعد المخزنة

السياق : كود مشاكل قائمة 4.

قائمة 4. يتم تخزين التعليمات البرمجية في مسألة القواعد

ObjectOutputStream خارج = ObjectOutputStream الجديد (

 جديد FileOutputStream ( "result.obj"))؛

 اختبار اختبار = اختبار جديد ()؛

 // محاولة الكتابة إلى كائن ملف مرتين

 out.writeObject (اختبار)؛

 out.flush ()؛

 System.out.println (ملف جديد ( "result.obj") طول ())؛

 out.writeObject (اختبار)؛

 out.close ()؛

 System.out.println (ملف جديد ( "result.obj") طول ())؛

 ObjectInputStream oin = ObjectInputStream جديدة (فيلينبوتستريام الجديد (

 "Result.obj"))؛

 // تلا بالتتابع ملفين من ملف

 اختبار T1 = (اختبار) oin.readObject ()؛

 اختبار T2 = (اختبار) oin.readObject ()؛

 oin.close ()؛

 // تحديد ما إذا كان مرجعين تشير إلى نفس الكائن

 System.out.println (T1 == T2)؛

قائمة 3 هو مكتوب مرتين لملف الكائن نفسه، وطباعة حجم الذاكرة والتخزين حجم مكتوبة مرتين بعد الهدف، ثم إلغاء تسلسل كائنين من ملف، مقارنة كائنين مرة واحدة والكتابة لنفس الكائن. التفكير العام هو ضعف حجم ملف الكتابة الهدف يصبح ضعف حجم، إلغاء التسلسل، لأن القراءة من ملف، ويولد كائنين، يجب أن تكون متساوية الأسماك كاذبة الحكم المدخلات، ولكن في النهاية يؤدي الناتج كما هو مبين في الشكل.

انتاج برنامج الرقم 4. مثال

ونحن نرى أن عند كتابة ملف الكائن للمرة الثانية ارتفاعا بنسبة 5 بايت، والكائنين متساوون، وهذا هو السبب؟

إجابة : آلية التسلسل جافا من أجل توفير مساحة القرص وفقا لقواعد محددة التخزين، عند كتابة ملف إلى نفس الكائن، ولن يتم تخزين محتوى الكائن، ولكن تخزين سوى إشارة إلى زيادة مرة أخرى فوق 5 كلمات قسم من مساحة التخزين المراجع الجديدة وبعض المساحة معلومات التحكم. إلغاء التسلسل، علاقة الانتعاش إشارة، بحيث T1 و T2 القائمة 3 نقطة الجسم فريدة من نوعها، وهما متساويان، وإخراج صحيح. حكم التخزين يحفظ كثيرا من مساحة التخزين.

الخصائص دراسة حالة

نظرة على التعليمات البرمجية في هذا العرض 5.

قائمة 5. رمز حالة

ObjectOutputStream خارج = ObjectOutputStream الجديد (FileOutputStream الجديد ( "result.obj"))؛

اختبار اختبار = اختبار جديد ()؛

test.i = 1؛

out.writeObject (اختبار)؛

out.flush ()؛

test.i = 2؛

out.writeObject (اختبار)؛

out.close ()؛

ObjectInputStream oin = ObjectInputStream جديدة (فيلينبوتستريام الجديد (

 "Result.obj"))؛

اختبار T1 = (اختبار) oin.readObject ()؛

اختبار T2 = (اختبار) oin.readObject ()؛

System.out.println (t1.i)؛

System.out.println (t2.i)؛

والغرض من قائمة 4 هو الأمل لحفظ الكائن الاختبار مرتين لملف result.obj، كتابة مرة واحدة بعد حفظ القيم سمة الكائن تعديل مرة أخرى للمرة الثانية، ثم تلا بالتتابع من كائنين result.obj، إخراج اثنين قيمة سمة من أنا كائن. والغرض من قانون كان يأمل في الأصل حالة قبل وبعد تغييرات حالة الكائن نقل لمرة واحدة.

نتائج مخرجات هما 1، والسبب هو أن تكون مكتوبة بعد الأول، للمرة الثانية في محاولة لكتابة، الجهاز الظاهري على أساس العلاقة إشارة نعلم بالفعل أن هناك واحد ولقد كتب نفس الكائن إلى ملف، وبالتالي يحفظ فقط مرة الثانية مراجع الكتابة، لذلك عند القراءة، هم أول من حفظ الكائنات. القراء باستخدام ملف عدة مرات writeObject بحاجة إلى إيلاء اهتمام خاص لهذه المسألة.

ملخص

من خلال عدة سيناريوهات محددة، فإنه يدخل بعض المعرفة المتقدمة جافا التسلسل، على الرغم من أن كبار، لا يعني أن القراء لا يفهمون عن أمله في أن المؤلف يصف المشهد لتعطي القارئ انطباعا أعمق، إلى استخدام تكنولوجيا التسلسل جافا أكثر عقلانية عندما على الطريق في تطوير مستقبل مشاكل التسلسل اجه يمكن حلها على وجه السرعة. نظرا لمعرفتي محدودة، إذا كانت المادة في المكان الخطأ، ومرحبا بكم في انتقاد الاتصال بي.

سامسونج Note9 بيع قاتمة، MEIZU 16 الساخن، لماذا سامسونج بارد في السوق الصينية؟

DC الأسرة أقل إيجابية: الربع الثالث بعد مرور ثماني سنوات، وقد حان أخيرا!

جيا يويتينغ مقر بيع FF في لوس انجليس، حصة قطرات تدمير التأديبية الدراجات السلوك

2019 أفلام الأعجوبة القادمة، TV قائمة يبين!

أعجوبة العدائين سريع، البطل القديم من الحرب العالمية الثانية - الرياح مان

فازت الهند أربعة أرباع متتالية من السوق لأول مرة! لماذا الهنود حتى في الهاتف الحب الدخن؟

انتهى الطغيان سوبرمان، تحولت الرمال سيمان لصالح المخلص!

يمكن تعدد مصادر البيانات المحدثة على أساس طبقة ديناميكية استمرار الربيع وiBATIS

التكوين يكاد يكون أكثر من فرق السعر، ولكن لماذا كثير من الناس لا تشتري هواوي المجد شرائه؟

"ساعة يوم القيامة": فرعون ومواجهة الكوميدي الموت!

البحوث وتطبيق إطار الأمن الويب استنادا RBAC

قوي هجوما مضادا مى رقم واحد قاد وحدته عادت، منغنيو ولد التجسد مؤلف من الله هو أقوى النصي