export interface ISerializeObject { serializeKey(key: string): void serializeValue(value: U): void serializeEntry(key: string, value: U): void end(): T } export abstract class SerializeObject implements ISerializeObject { abstract serializeKey(key: string): void abstract serializeValue(value: U): void abstract end(): T serializeEntry(key: string, value: U): void { this.serializeKey(key) this.serializeValue(value) } } export interface ISerializeIterable { serializeElement(value: U): void end(): T } export abstract class SerializeIterable implements ISerializeIterable { abstract serializeElement(value: U): void abstract end(): T } export interface ISerializer { serializeAny?(value: any): T serializeBoolean(value: boolean): T serializeNumber(value: number): T serializeBigInt(value: bigint): T serializeString(value: string): T serializeSymbol(value: symbol): T serializeNull(): T serializeIterable(len?: number): ISerializeIterable serializeObject(len?: number): ISerializeObject serializeClass(name: string, len?: number): ISerializeObject } export class Serializer implements ISerializer { serializeAny(_value: any): T { throw new Error("Method not implemented.") } serializeBoolean(_value: boolean): T { throw new Error('Method not implemented.') } serializeNumber(_value: number): T { throw new Error('Method not implemented.') } serializeBigInt(_value: bigint): T { throw new Error('Method not implemented.') } serializeString(_value: string): T { throw new Error('Method not implemented.') } serializeSymbol(_value: symbol): T { throw new Error('Method not implemented.') } serializeNull(): T { throw new Error('Method not implemented.') } serializeIterable(_len: number): ISerializeIterable { throw new Error("Method not implemented.") } serializeObject(_len: number): ISerializeObject { throw new Error('Method not implemented.') } serializeClass(_name: string, _len: number): ISerializeObject { throw new Error('Method not implemented.') } } export interface Serialize { (serializer: ISerializer, value: U): T }