Objektserialisierung in TypeScript: Ein vollständiger Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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); // Ivan


Fü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); // Anna


Dieser 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-metadata


Anwendungsbeispiel:



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

Empfehlungen