ماذا يعني: الطبقة القابلة للتسلسل لا تعلن عن مجال التسلسل النهائي الثابت؟ [مكرر

StackOverflow https://stackoverflow.com/questions/2288937

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

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

ملاحظة أنا أعرف ما هو OOP. أعرف ما هو الكائن والفئة والطريقة والحقل والتثبيت.

PPS إذا احتاج شخص ما إلى الكود الخاص بي ، فهو هنا:

import java.awt.*;
import javax.swing.*;


public class HelloWorldSwing extends JFrame {

        JTextArea m_resultArea = new JTextArea(6, 30);

        //====================================================== constructor
        public HelloWorldSwing() {
            //... Set initial text, scrolling, and border.
            m_resultArea.setText("Enter more text to see scrollbars");
            JScrollPane scrollingArea = new JScrollPane(m_resultArea);
            scrollingArea.setBorder(BorderFactory.createEmptyBorder(10,5,10,5));

            // Get the content pane, set layout, add to center
            Container content = this.getContentPane();
            content.setLayout(new BorderLayout());
            content.add(scrollingArea, BorderLayout.CENTER);
            this.pack();
        }

        public static void createAndViewJFrame() {
            JFrame win = new HelloWorldSwing();
            win.setTitle("TextAreaDemo");
            win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            win.setVisible(true);
        }

        //============================================================= main
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable(){
                public void run(){
                    createAndViewJFrame();
                }
            });
        }

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

المحلول

من جافادوك:

يرتبط وقت تشغيل التسلسل مع كل رقم إصدار من الفئة A القابل للتسلسل ، يسمى أ serialVersionUID, ، والذي يتم استخدامه أثناء هجرته للتحقق من أن المرسل والمستقبل للكائن المسلسل قد قاموا بتحميل فئات لهذا الكائن المتوافق فيما يتعلق بالتسلسل. إذا كان المتلقي قد قام بتحميل فئة للكائن الذي لديه مختلف serialVersionUID من فئة المرسل المقابلة ، فإن إزالة التخلص من التخلص من InvalidClassException. يمكن للطبقة القابلة للتسلسل أن تعلن عن طريقها serialVersionUID صراحة من خلال إعلان حقل اسمه "serialVersionUID" يجب أن يكون ذلك ثابتًا ونهائيًا ونوعًا طويلًا:

يمكنك تكوين IDE الخاص بك إلى:

  • تجاهل هذا ، بدلاً من تحذير.
  • Autogenerate معرف

وفقًا لسؤالك الإضافي "هل يمكن أن تكون رسالة التحذير التي تمت مناقشتها هي سبب لتجميد تطبيقات واجهة المستخدم الرسومية؟":

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

نصائح أخرى

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

public class HelloWorldSwing extends JFrame {

        JTextArea m_resultArea = new JTextArea(6, 30);
        private static final long serialVersionUID = 1L;

الإجابات الأخرى حتى الآن لديها الكثير من المعلومات التقنية. سأحاول الإجابة ، كما هو مطلوب ، بعبارات بسيطة.

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

إذا لم يكن لديك أي نية لتسلسل صفك ، فيمكنك إضافة التعليق التوضيحي فوق فصلك @SuppressWarnings("serial").

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

يجب تغييره عندما يتغير أي شيء يؤثر على التسلسل (حقول إضافية ، وحقول تمت إزالتها ، وتغيير ترتيب الحقل ، ...)

هذا ليس صحيحًا ، ولن تتمكن من الاستشهاد بمصدر رسمي لتلك المطالبة. يجب تغييره كلما قمت بإجراء تغيير غير متوافق بموجب القواعد الواردة في إصدار كائنات قابلة للتسلسل قسم من مواصفات التسلسل الكائن, ، وهو ما يفعله على وجه التحديد ليس تضمين حقول إضافية أو تغيير ترتيب الحقل ، و عندما لم تقدم readObject(), writeObject(), و/أو readResolve() أو /writeReplace() الطرق و/أو أ serializableFields الإعلان الذي يمكن أن يتعامل مع التغيير.

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

لاحظ أن هذه القيمة خاصة من حيث أنها متسلسلة مع الكائن على الرغم من أنها ثابتة ، للأسباب الموضحة أعلاه.

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