serialization

Üdvözlöm, Ön a serialization szó jelentését keresi. A DICTIOUS-ban nem csak a serialization szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a serialization szót egyes és többes számban mondani. Minden, amit a serialization szóról tudni kell, itt található. A serialization szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. Aserialization és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.

Főnév

serialization (tsz. serializations)

  1. (informatika) A C++ szerializáció (serialization) azt jelenti, hogy egy objektum állapotát egy sorozattá (általában szöveges vagy bináris formátumba) alakítjuk, amit később vissza lehet olvasni (deszerializálás, azaz deserialization). Ez különösen fontos fájlkezelésnél, adatátvitel során (pl. hálózaton keresztül), vagy amikor egy program bezárása után is meg akarjuk őrizni az objektumok állapotát.

Ebben a leírásban JSON-alapú szerializációval foglalkozunk, és a nlohmann::json C++ könyvtár segítségével valósítjuk meg, amely egy modern, könnyen használható, header-only JSON parser és serializer.



🔧 Előkészületek

Telepítés

Ez a könyvtár egyetlen json.hpp fájlból áll:

  1. Töltsd le innen: json.hpp
  2. Másold a projekted include/ mappájába, vagy oda, ahonnan az #include megtalálja.



🧠 Alapok: nlohmann::json típus

#include <nlohmann/json.hpp>
using json = nlohmann::json;

A json típus egy union-szerű wrapper, amely lehet:

  • string, szám, bool
  • tömb (vector-szerű)
  • objektum (map-szerű)



📦 Egyszerű típusok kezelése

json j;
j = "Alice";
j = 30;
j = false;

std::cout << j.dump(4); // pretty-print

🔁 Szerializálás – objektum -> JSON

Tegyük fel, hogy van egy struct:

struct Person {
    std::string name;
    int age;
    bool student;
};

Szerializáláshoz két függvényt definiálunk: to_json – JSON-t készít egy objektumból from_json – objektumot hoz létre JSON-ból

void to_json(json& j, const Person& p) {
    j = json{{"name", p.name}, {"age", p.age}, {"student", p.student}};
}

void from_json(const json& j, Person& p) {
    j.at("name").get_to(p.name);
    j.at("age").get_to(p.age);
    j.at("student").get_to(p.student);
}

Használat:

Person p{"Bob", 22, true};
json j = p;

std::cout << j.dump();  // {"name":"Bob","age":22,"student":true}

Person p2 = j.get<Person>();

📁 Fájlba írás / fájlból olvasás

#include <fstream>

// Írás
std::ofstream out("person.json");
out << j.dump(4); // szépen formázva
out.close();

// Olvasás
std::ifstream in("person.json");
json j2;
in >> j2;
Person p3 = j2.get<Person>();

🧱 Komplex típusok – tömb, objektum tömb

std::vector<Person> people = {
    {"Alice", 25, false},
    {"Bob", 22, true}
};

json j = people;  // automatikusan sorozattá alakul

std::ofstream("people.json") << j.dump(2);

// Deszerializálás
std::ifstream f("people.json");
json j2;
f >> j2;
std::vector<Person> others = j2.get<std::vector<Person>>();

🧩 Alternatív: kézi konverzió osztály metódusokkal

struct Product {
    std::string id;
    int price;

    json toJson() const {
        return json{{"id", id}, {"price", price}};
    }

    static Product fromJson(const json& j) {
        return Product{j.at("id"), j.at("price")};
    }
};

⚠️ Hibakezelés

try {
    json j = json::parse("{bad json}");
} catch (const json::parse_error& e) {
    std::cerr << "Hiba: " << e.what() << "\n";
}

🧪 Tipikus hibák

Hiba Ok
type must be string but is null JSON-ben a kulcs vagy érték null, nem string
key not found at("kulcs") nem található; használj contains()
type_error.302 Rossz típusú értéket próbálsz kiolvasni



🎯 Összefoglalás

Művelet Kód példa
Szerializálás json j = objektum;
Deszerializálás Objektum o = j.get<Objektum>();
Írás fájlba ofstream f("f.json"); f << j.dump();
Olvasás fájlból ifstream f("f.json"); f >> j;
Egyedi konverzió to_json, from_json függvények

Íme egy teljes példa arra, hogyan lehet egy JSON tömböt kiírni fájlba a nlohmann::json könyvtárral, egy általánosabb témában – például diákok vizsgapontszámai:



✅ Példa: vizsgaEredmenyekKiiras()

#include <iostream>
#include <fstream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
using namespace std;

void vizsgaEredmenyekKiiras() {
    // 1. JSON tömb inicializálása
    json eredmenyek = json::array();

    // 2. Feltöltés példákkal
    vector<string> diakok = {"Anna", "Béla", "Csaba", "Dóra"};
    vector<int> pontszamok = {92, 78, 85, 66};

    for (size_t i = 0; i < diakok.size(); ++i) {
        json egyEredmeny = {
            {"nev", diakok},
            {"pontszam", pontszamok},
            {"sikeres", pontszamok >= 60}
        };

        eredmenyek.push_back(egyEredmeny);
    }

    // 3. Fájlba írás (pretty print)
    ofstream out("vizsgaeredmenyek.json");
    if (!out) {
        cerr << "Nem sikerült megnyitni az output fájlt!" << endl;
        return;
    }

    out << eredmenyek.dump(4); // 4 szintű indentálás
    out.close();

    cout << "Kiírás kész: vizsgaeredmenyek.json" << endl;
}

📁 A keletkezett vizsgaeredmenyek.json fájl tartalma:

[
    {
        "nev": "Anna",
        "pontszam": 92,
        "sikeres": true
    },
    {
        "nev": "Béla",
        "pontszam": 78,
        "sikeres": true
    },
    {
        "nev": "Csaba",
        "pontszam": 85,
        "sikeres": true
    },
    {
        "nev": "Dóra",
        "pontszam": 66,
        "sikeres": true
    }
]