Objektserialisierung in TypeScript: von JSON bis protobuf
Serialisierung ist der Prozess der Umwandlung einer komplexen Datenstruktur (Objekt, Array, Klasseninstanz) in ein Format, das für die Speicherung oder Übertragung über ein Netzwerk geeignet ist. Der umgekehrte Prozess – Deserialisierung – stellt das Objekt aus diesem Format wieder her. In TypeScript, einem streng typisierten Overlay über JavaScript, gewinnt die Serialisierung eine besondere Bedeutung: Es ist wichtig, nicht nur Daten zu übertragen, sondern auch Typen, Methoden und die Klassenstruktur zu erhalten.
In diesem Artikel betrachten wir die wichtigsten Ansätze und Werkzeuge zur Serialisierung von Objekten in TypeScript, von integrierten Mitteln bis hin zu spezialisierten Bibliotheken.
1. Native Serialisierung: JSON.stringify und JSON.parse
Der einfachste und gebräuchlichste Weg ist die Verwendung der integrierten Methoden JSON.stringify() und JSON.parse(). Dieser Ansatz hat jedoch Einschränkungen:
- Funktionen,
undefined,Symbol,BigInt(in älteren Versionen) werden nicht serialisiert. - Der Prototyp des Objekts bleibt nicht erhalten – bei der Deserialisierung erhalten Sie ein gewöhnliches Objekt, keine Klasseninstanz.
- Zyklische Referenzen verursachen einen Fehler.
// Beispiel einer einfachen Serialisierunginterface User { id: number; name: string; email: string;}
const user: User = { id: 1, name: "Ivan", email: "ivan@example.com"};
const jsonString = JSON.stringify(user);console.log(jsonString); // {"id":1,"name":"Ivan","email":"ivan@example.com"}
const parsedUser: User = JSON.parse(jsonString);console.log(parsedUser.name); // IvanFür einfache Daten reicht dies aus, aber wenn Sie mit Klassen arbeiten müssen, benötigen Sie eine fortgeschrittenere Lösung.
2. Benutzerdefinierte Serialisierung mit toJSON- und fromJSON-Methoden
TypeScript (und JavaScript) ermöglicht es, in einer Klasse die Methode toJSON() zu definieren, die bei der Serialisierung über JSON.stringify aufgerufen wird. Für die Deserialisierung können Sie eine statische Methode fromJSON erstellen.
class Person { constructor( public firstName: string, public lastName: string, public age: number ) {}
// Methode zur Serialisierung toJSON() { return { fullName: `${this.firstName} ${this.lastName}`, age: this.age }; }
// Statische Methode zur Deserialisierung static fromJSON(json: any): Person { const [firstName, lastName] = json.fullName.split(' '); return new Person(firstName, lastName, json.age); }}
const person = new Person("Anna", "Petrova", 30);const json = JSON.stringify(person);console.log(json); // {"fullName":"Anna Petrova","age":30}
const restoredPerson = Person.fromJSON(JSON.parse(json));console.log(restoredPerson.firstName); // AnnaDieser Ansatz bietet volle Kontrolle, erfordert jedoch das Schreiben von Boilerplate-Code für jede Klasse.
3. Die Bibliothek class-transformer
class-transformer ist eine der beliebtesten Bibliotheken für Serialisierung/Deserialisierung in TypeScript. Sie ermöglicht es, gewöhnliche Objekte mit Hilfe von Dekorateuren in Klasseninstanzen und zurück umzuwandeln.
Installation:
npm install class-transformer reflect-metadataAnwendungsbeispiel:
import { plainToClass, classToPlain, Expose, Transform } from "class-transformer";import "reflect-metadata";
class Product { @Expose() id: number;
@Expose() name: string;
@Expose() @Transform(({ value }) => value.toUpperCase()) // benutzerdefinierte Transformation category: string;
@Expose({ name: "price_with_tax" }) // Feld umbenennen price: number;
constructor(id: number, name: string, category: string, price: number) { this.id = id; this.name = name; this.category = category; this.price = price; }
getInfo(): string { return `${this.name} (${th Auch in der Bibliothek
Elasticsearch-Client für Java: Vollständige Anleitung zur Arbeit mit dem Java Client
Generierung von PDF-Berichten in Go: Bibliotheksübersicht und Codebeispiele
Autorisierung und Authentifizierung in Go: Pakete und praktische Beispiele
Reaktive Programmierung in Kotlin: Die Bibliothek RxKotlin und Koroutinen