fontcolor_theme
Deepkit Runtime Types

Erweitern

Benutzerdefinierte Serialisierung

Sie können die Serialisierung für einen Type erweitern, indem Sie entweder Ihren eigenen Serializer schreiben oder den Standard-serializer erweitern.

Dieses Beispiel zeigt, wie man eine Class Point in ein Tuple [number, number] serialisiert und deserialisiert.

import { serializer, SerializationError } from '@deepkit/type';

class Point {
  constructor(public x: number, public y: number) {
  }
}

// Deserialisieren bedeutet von JSON zu einer (Class-)Instanz.
serializer.deserializeRegistry.registerClass(Point, (type, state) => {
  state.convert((v: any) => {
    // wenn es bereits eine Point-Instanz ist, sind wir fertig
    if (v instanceof Point) return v;

    // an diesem Punkt könnte `v` alles Mögliche sein (außer undefined), daher müssen wir prüfen
    if (!Array.isArray(v)) throw new SerializationError('Expected array');
    if (v.length !== 2) throw new SerializationError('Expected array with two elements');
    if (typeof v[0] !== 'number' || typeof v[1] !== 'number') throw new SerializationError('Expected array with two numbers');
    return new Point(v[0], v[1]);
  });
});

serializer.serializeRegistry.registerClass(Point, (type, state) => {
  state.convert((v: Point) => {
    // an diesem Punkt ist `v` immer eine Point-Instanz
    return [v.x, v.y];
  });
});

// cast und deserialize verwenden standardmäßig den `serializer`
const point = cast<Point>([1, 2], undefined, serializer);
expect(point).toBeInstanceOf(Point);
expect(point.x).toBe(1);
expect(point.y).toBe(2);

{
  expect(() => deserialize<Point>(['vbb'])).toThrowError(SerializationError);
  expect(() => deserialize<Point>(['vbb'])).toThrow('Expected array with two elements')
}

// serialize verwendet standardmäßig den `serializer`
const json = serialize<Point>(point);
expect(json).toEqual([1, 2]);

Bitte beachten Sie, dass dies nur für die regulären @deepkit/type Functions wie cast, deserialize und serialize funktioniert.

Dies wird nicht in die Datenbankschicht übernommen, da die Datenbankschicht die Types verwendet, wie sie in der Entity Class für Migration und Serialisierung definiert sind (z. B. BSON-Serialisierung).

English中文 (Chinese)한국어 (Korean)日本語 (Japanese)Deutsch (German)