serialization
Megjelenés
Főnév
serialization (tsz. serializations)
- (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:
- Töltsd le innen: json.hpp
- Másold a projekted
include/mappájába, vagy oda, ahonnan az#includemegtalá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["name"] = "Alice";
j["age"] = 30;
j["isStudent"] = 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[i]},
{"pontszam", pontszamok[i]},
{"sikeres", pontszamok[i] >= 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
}
]
- serialization - Szótár.net (en-hu)
- serialization - Sztaki (en-hu)
- serialization - Merriam–Webster
- serialization - Cambridge
- serialization - WordNet
- serialization - Яндекс (en-ru)
- serialization - Google (en-hu)
- serialization - Wikidata
- serialization - Wikipédia (angol)