CodeGym /Kurslar /JAVA 25 SELF /Sərializasiya üçün standart formatlar: binar, mətn

Sərializasiya üçün standart formatlar: binar, mətn

JAVA 25 SELF
Səviyyə , Dərs
Mövcuddur

1. Java-da binar sərializasiya

Binar sərializasiya — bu, Java-nın standart mexanizmidir; obyekt mümkün qədər yığcam və sürətli şəkildə bayt axınına çevrilir. Bunun üçün ObjectOutputStreamObjectInputStream siniflərindən istifadə olunur. Nəticədə yaranan fayl — insan tərəfindən oxunması nəzərdə tutulmayan bayt dəstidir.

Ona “binar” deyilir, çünki hər şey “xam” halda sərializasiya olunur: ədədlər, sətirlər, massivlər, hətta obyektlər arasındakı istinadlar belə baytlara çevrilir. Bu, bərk-bərk yığılmış çemodan kimidir: səmərəli və sürətlidir, amma təlimat olmadan nə nəyin harada olduğu aydın deyil.

Java-da bu necə işləyir?

Tutaq ki, bizdə User sinfi var:

import java.io.Serializable;

public class User implements Serializable {
    private String name;
    private int age;

    // Konstruktor, getter və setterlər
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() { return name; }
    public int getAge() { return age; }
}

Binar fayla sərializasiya

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

User user = new User("Vasya", 30);

try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("user.bin"))) {
    out.writeObject(user);
    System.out.println("User obyekti user.bin faylına sərializasiya olunub");
} catch (Exception e) {
    e.printStackTrace();
}

Binar fayldan desərializasiya

import java.io.FileInputStream;
import java.io.ObjectInputStream;

try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("user.bin"))) {
    User loadedUser = (User) in.readObject();
    System.out.println("Fayldan oxundu: " + loadedUser.getName() + ", " + loadedUser.getAge());
} catch (Exception e) {
    e.printStackTrace();
}

Diqqət: əgər user.bin faylını mətn redaktorunda açsanız, belə bir şey görəcəksiniz: ¬í sr ... — bu normaldır, elə belə nəzərdə tutulub!

Binar sərializasiyanın üstünlükləri

  • Yığcamlıq və sürət. Saxlama və oxuma mümkün qədər sürətlə, əlavə “bəzəklər” olmadan icra olunur.
  • Obyektin bütün sahələri, o cümlədən iç-içə obyektlər (əgər onlar da Serializable vasitəsilə sərializasiya oluna bilirsə) saxlanılır.
  • Daxili keş üçün və ya Java proqramları arasında ötürmək üçün istifadə etmək rahatdır.

Mənfi cəhətlər

  • Oxunaqlı deyil. İnsan məzmunu “gözucu” görüb nə olduğunu anlaya bilməz.
  • Sinif versiyasına sərt bağlılıq. Strukturun dəyişməsi (sahələrin əlavə/çıxarılması) köhnə faylların oxunmasını “sındıra” bilər.
  • JavaJVM-in müxtəlif versiyaları arasında uyğunluq problemləri.
  • Başqa proqramlaşdırma dilləri ilə mübadilə üçün uyğun deyil.
  • Təhlükəsizlik: yoxlanmamış mənbələrdən alınan məlumatların desərializasiyası — zəifliklərə birbaşa yoldur.

2. Mətn əsaslı sərializasiya formatları: JSON, XML və digərləri

Binar sərializasiya daxili istifadə üçün yaxşıdır, amma tez-tez məlumatları müxtəlif dillər (Java, JavaScript, Python) arasında ötürmək və ya onları oxunaqlı formada saxlamaq lazım olur — konfiqurasiyalar, loglar, API üçün əlverişlidir. Bunun üçün mətn formatlarından istifadə edilir: JSON, XML, YAML, CSV və s.

JSON — ən populyarı

JSON (JavaScript Object Notation) — yığcam və oxunaqlı formatdır. Sərializə olunmuş User obyektinə nümunə:

{
  "name": "Vasya",
  "age": 30
}

Java-da JSON ilə işləmək üçün adətən bu kitabxanalardan istifadə olunur: ən populyarı Jackson, həmçinin Gson, eləcə də Moshi, JSON-B və b.

XML — proqramçının köhnə dostu

XML (Extensible Markup Language) — daha “sözçül”, amma formal və sərtdir.

<User>
  <name>Vasya</name>
  <age>30</age>
</User>

XML üçün Java-da tez-tez standart JAXB kitabxanasından (və ya daha köhnə XStream-dən) istifadə olunur.

YAML, CSV və digərləri

  • YAML — JSON-a bənzəyir, lakin daha yığcamdır; mürəkkəb obyektlərin sərializasiyasındansa, daha çox konfiqlər üçün istifadə olunur.
  • CSV — “yastı” cədvəllər üçün yaxşıdır, lakin iç-içə strukturlar üçün uyğun deyil.
  • Hər zövqə uyğun başqa formatlar da var, amma Java-da ən çox JSONXML istifadə olunur.

3. Formatların müqayisəsi: hansını nə vaxt istifadə etməli?

Format Oxunaqlılıq Yığcamlıq Sürət Uyğunluq Nə vaxt istifadə etmək
Binar Xeyr ++ ++ Yalnız Java Daxili keş, JVM-lər arasında sürətli saxlanma
JSON Bəli + + İstənilən dillər REST API, xarici servislərlə mübadilə, konfiqurasiyalar
XML Bəli - - İstənilən dillər İntegrasiya, sərt sxemlər, köhnə sistemlər
  • Binar — xarici sistemlərlə mübadilə tələb olunmadıqda və maksimum performans vacib olduqda daxili istifadə üçün seçin.
  • JSON — veb tətbiqləri, mobil müştərilər və REST API ilə mübadilə, eləcə də ayarların saxlanması üçün ən yaxşı seçimdir.
  • XML — sərt sxemlər tələb olunduqda və “korporativ” həllərlə inteqrasiya zamanı lazımdır.

Vacibdir! Binar sərializasiya yalnız Java proqramları arasında məlumat ötürülməsi üçün uyğundur və bu halda belə, eyni versiyalı proqramlar arasında istifadə etmək daha təhlükəsizdir. JSONXML kimi mətn formatları daha universaldır: onlar müxtəlif dillər və platformalar arasında məlumat mübadiləsinə imkan verir, məlumatı oxunaqlı və daşına bilən edir.

4. Praktika: binar və mətn formata sərializasiya

Binar sərializasiya (ObjectOutputStream/ObjectInputStream)

Yuxarıda gördük, lakin möhkəmləndirmək üçün təkrar:

// Sərializasiya
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("user.bin"))) {
    out.writeObject(user);
}

// Desərializasiya
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("user.bin"))) {
    User loadedUser = (User) in.readObject();
}

Jackson ilə JSON-a sərializasiya (qısa)

Jackson ilə işləmək üçün onun kitabxanalarını layihəyə əlavə etmək lazımdır. Biz MavenGradle-i sonra öyrənəcəyik, hələlik isə JAR fayllarını əl ilə qoşa bilərsiniz. Maven üçün asılılıq nümunəsi:

<!-- Maven -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.17.0</version>
</dependency>

Sərializasiya/desərializasiya nümunəsi:

import com.fasterxml.jackson.databind.ObjectMapper;

User user = new User("Vasya", 30);
ObjectMapper mapper = new ObjectMapper();

try {
    // Sətirə sərializasiya
    String json = mapper.writeValueAsString(user);
    System.out.println(json); // {"name":"Vasya","age":30}

    // Fayla sərializasiya
    mapper.writeValue(new File("user.json"), user);

    // Sətirdən desərializasiya
    User loadedUser = mapper.readValue(json, User.class);

    // Fayldan desərializasiya
    User loadedFromFile = mapper.readValue(new File("user.json"), User.class);

} catch (Exception e) {
    e.printStackTrace();
}

JSON faylını istənilən mətn redaktorunda açmaq olar, bu da məlumatları müxtəlif tətbiqlər və dillər arasında asan oxunaqlı və daşına bilən edir.

5. Hansı formatı nə vaxt istifadə etməli: praktiki məsləhətlər

  • Daxili keşləmə, müvəqqəti fayllar, Java proqramları arasında sürətli yazma/oxuma: standart binar sərializasiyadan istifadə edin. Amma versiya uyğunluğunu unutmayın!
  • Xarici servislərlə mübadilə, ayarların saxlanması, frontend ilə inteqrasiya: JSON (Jackson, Gson).
  • Sərt sxem tələb olunan “korporativ” sistemlərlə inteqrasiya: XML (JAXB).
  • İstəyirsinizsə ki, faylı insan açıb oxuya bilsin: JSON və ya XML, amma binar format deyil.

6. Sərializasiya formatları ilə işləyərkən tipik səhvlər

Səhv № 1: Sərializasiya olunmayan sahələri olan obyekti sərializə etməyə çalışırlar. Əgər sinfinizdə Serializable həyata keçirməyən sahə varsa (məsələn, axın və ya DB bağlantısı), binar sərializasiya xəta verəcək. JSON üçün bu o qədər də kritik deyil, amma “standart olmayan” tiplərlə problemlər olur.

Səhv № 2: Binar faylı mətn redaktorunda açıb qorxurlar. Bu normaldır! Binar fayllar insan tərəfindən oxunmaq üçün nəzərdə tutulmayıb.

Səhv № 3: Sinfin strukturunu dəyişirlər və köhnə binar fayllar oxunmur. Binar sərializasiya sinfin struktur dəyişikliyinə həssasdır — tez-tez InvalidClassException yaranır. JSON/XML-də bu daha az kritikdir: naməlum sahələr adətən yox sayılır və ya standart dəyərlər alır.

Səhv № 4: Xarici sistemlərlə mübadilə üçün binar sərializasiyadan istifadə edirlər. Bu işləməyəcək: binar formatı yalnız Java anlayır, o da versiyalar uyğun gələndə.

Səhv № 5: JSON/XML üçün lazım olan annotasiyaları əlavə etməyi unudurlar. Bəzi kitabxanalar @JsonProperty, @XmlElement kimi annotasiyalar tələb edir, əks halda sərializasiya/desərializasiya gözlənildiyi kimi işləməyə bilər.

Səhv № 6: Bütün iç-içə obyektlərin sərializasiya oluna bildiyini yoxlamırlar. Binar sərializasiya üçün bu, tez-tez rast gəlinən problemdir; modeldə mürəkkəb tiplər varsa, JSON üçün də eyni hal mümkündür.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION