سؤال

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

B b = new B();
b.x = 7; //allowed to use an instance to set the static member value

بعد هذا ب تسلسل ثم de-تسلسل.ثم السطر التالي يحدث:

System.out.println ("static: " + b.x);

ما هي القيمة ؟ 7 أو 3 ؟

أنا أعرف متغيرات ثابتة لا تسلسل ، ومع ذلك ، وبما أن هناك نسخة واحدة فقط من عضو ثابت لكل فئة ، يتم تعيين القيمة إلى 7 ، ينبغي الحفاظ عليها بعد de-التسلسلية غير سبيل المثال ؟

هل كانت مفيدة؟

المحلول

وإليك ما سيحدث:

  1. ثابت مهيئ مجموعات القيمة إلى 3.
  2. المثال منشئ مجموعات قيمة إلى 7.
  3. التسلسل هو علم متغير ثابت و هو تجاهلها.
  4. د-التسلسل هو علم متغير ثابت و هو تجاهلها.
  5. قيمة لا تزال 7 (من التغيير الذي حدث في منشئ) إذا كان البرنامج قد تم تشغيل كل جانب ، أو إذا كان البرنامج إيقاف تشغيل و إعادة تشغيل ثابت مهيئ سوف يكون تعيين إلى 3 دي-التسلسل لم يغير ذلك.

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

نصائح أخرى

إذا كنت إلغاء تسلسل في نفس مثيل JVM، سوف المتكررة الثاني يعود 7. هذا هو بسبب تعيين قيمة BX إلى 7. وهذا لم يتغير ل<م> مثيل B وكان تسلسل وإلغاء تسلسل.

إذا تسلسل الكائن، اغلاق JVM، إحضار JVM جديد، ومن ثم إلغاء تسلسل الكائن (دون تحديد b.x في أي مكان آخر من التهيئة ثابت)، وقيمة b.x ستكون 3.

استخدم التعليمة البرمجية التالية إلى تسلسل وإلغاء تسلسل وجوه من / تيار في الذاكرة:

package com.example.serialization;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable; 
import junit.framework.TestCase;


public class SerializationTest extends TestCase {
    public void testStaticValueAfterSerialization() {
       B b = new B();
       b.x = 7; //allowed to use an instance to set the static member value

       B deserializedB = copyObject(b);
       assertEquals("b.x should be 7 after serialization", 7, deserializedB.x);
    }

    private <T extends Serializable> T copyObject(final T source) {
        if (source == null)
                throw new IllegalArgumentException("source is null");
        final T copy;
        try {
            copy = serializationClone(source);
            } catch (Exception e) {
                // (optional) die gloriously!
            throw new AssertionError("Error copying: " + source, e);
        }    
            return copy;
    }

    private <T extends Serializable> T serializationClone(final T source)
        throws IOException, ClassNotFoundException {
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
    ObjectOutputStream outputStream = new ObjectOutputStream(byteStream);

            // 1. serialize the object to the in-memory output stream
        outputStream.writeObject(source);

        ObjectInputStream inputStream = new ObjectInputStream(
                new ByteArrayInputStream(byteStream.toByteArray()));

        // 2. deserialize the object from the in-memory input stream
        @SuppressWarnings("unchecked")
            final T copy = (T) inputStream.readObject();

        return copy; // NOPMD : v. supra
    }
}

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

ومنذ المهيآت ثابتة تعمل مرة واحدة بالضبط، والقيمة هي 7.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top