English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

هل يتم حفظ قيم المتغيرات الثابتة عند التسلسل في Java؟

في Java، التسلسل هو مفهوم حيث يمكننا كتابة حالة الكائن إلى تدفق البايتات، مما يتيح لنا نقلها عبر الشبكة (باستخدام تقنيات مثل JPA وRMI).

التسلسل الكائن-

  • تأكد من أن هذه الفئة قد قامت بتنفيذ واجهة Serializable.

  • إنشاءFileOutputStreamالكائن، الذي يمثل الملف الذي سيتم حفظ الكائن فيه (المسار التجريدي).

  • من خلال إرسال الكائن الذي تم إنشاؤهFileOutputStreamالكائن لإنشاء ObjectOutputStream كائن.

  • كتابة الكائن في الملف باستخدام طريقة writeObject().

تفسير الكائن

  • إنشاءFileInputStreamالكائن، الذي يمثل ملف يحتوي على الكائن المتسلسل.

  • قراءة الكائن من ملف باستخدام طريقة readObject().

  • استخدام الكائن الذي تم استرداده.

تفسير المتغيرات في كائن التسلسل

عندما نقوم بتفسير عنصر واحد فقط، سيتم حفظ المتغيرات الكائنة وسيعزز لديها نفس القيمة بعد هذه العملية.

المتغيرات الفورية  - لن يتم النظر فيها أبدًاالمتغيرات الفوريةالقيمة (باستثناءها من عملية التسلسل). على سبيل المثال، عندما نعلن عن متغير فوري، سيكون قيمته دائمًا null أو false أو صفر (القيمة الافتراضية) بعد التسلسل.

متغیرهای استاتیک  - در طول فرآیند دسریال‌سازی، آنها حفظ نخواهند شدمتغیرهای استاتیکمقادیر. در واقع، متغیرهای استاتیک نیز سریالی‌سازی نمی‌شوند، اما زیرا به این کلاس تعلق دارند. پس از десریال‌سازی، آنها مقادیر فعلی کلاس را دریافت می‌کنند.

مثال

در این برنامه، ما مقادیر نمونه، متغیرهای استاتیک و موقت کلاس را قبل از десریال‌سازی تغییر دادیم.

بعد از این فرآیند، مقادیر متغیرهای نمونه مشابه خواهند شد. متغیرهای موقت مقادیر پیش‌فرض را نشان می‌دهند، در حالی که متغیرهای استاتیک مقادیر جدید (حال حاضر) کلاس را نشان می‌دهند.

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class Student implements Serializable{
   private String name;
   private transient int age;
   private static int year = 2018;
   public Student(){
      System.out.println("This is a constructor");
      this.name = "Krishna";
      this.age = 25;
   }
   public Student(String name, int age){
      this.name = name;
      this.age = age;
   }
   public void display() {
      System.out.println("Name: " + this.name);
      System.out.println("Age: " + this.age);
      System.out.println("Year: " + Student.year);
   }
   public void setName(String name) {
      this.name = name;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public void setYear(int year) {
      Student.year = year;
   }
}
public class SerializeExample{
   public static void main(String args[]) throws Exception{
      //أنشئ جسم Student
      Student std = new Student("Vani", 27);
      //تحليل معكوس لجسم
      FileOutputStream fos = new FileOutputStream("e:\\student.ser");
      ObjectOutputStream oos = new ObjectOutputStream(fos);
      oos.writeObject(std);
      oos.close();
      fos.close();
      //اطبع البيانات قبل التحليل المعكوس
      System.out.println("القيمة قبل التحليل المعكوس:");
      std.display();
      //تغيير قيمة المتغير الثابت
      std.setYear(2019);
      //تغيير قيمة المتغير المثلي
      std.setName("Varada");
      //تغيير قيمة المتغير اللحظي
      std.setAge(19);
      System.out.println("Object serialized.......");
      //تحليل معكوس لجسم
      FileInputStream fis = new FileInputStream("e:\\student.ser");
      ObjectInputStream ois = new ObjectInputStream(fis);
      Student deSerializedStd = (Student) ois.readObject();
      System.out.println("Object de-serialized.......");
      ois.close();
      fis.close();
      System.out.println("القيمة بعد التحليل المعكوس:");
      deSerializedStd.display();
   }
}

نتيجة الاصدار

القيمة قبل التحليل المعكوس:
الاسم: Vani
العمر: 27
السنة: 2018
Object serialized......
Object de-serialized......
القيمة بعد التحليل المعكوس:
الاسم: Vani
العمر: 0
السنة: 2019
من المحتمل أن تعجبك