Files
esengine/packages/editor-core/src/Services/SerializerRegistry.ts
2025-10-14 22:33:55 +08:00

182 lines
4.9 KiB
TypeScript

import type { IService } from '@esengine/ecs-framework';
import { Injectable } from '@esengine/ecs-framework';
import { createLogger } from '@esengine/ecs-framework';
import type { ISerializer } from '../Plugins/IEditorPlugin';
const logger = createLogger('SerializerRegistry');
/**
* 序列化器注册表
*
* 管理所有数据序列化器的注册和查询。
*/
@Injectable()
export class SerializerRegistry implements IService {
private serializers: Map<string, ISerializer> = new Map();
/**
* 注册序列化器
*
* @param pluginName - 插件名称
* @param serializer - 序列化器实例
*/
public register(pluginName: string, serializer: ISerializer): void {
const type = serializer.getSupportedType();
const key = `${pluginName}:${type}`;
if (this.serializers.has(key)) {
logger.warn(`Serializer for ${key} is already registered`);
return;
}
this.serializers.set(key, serializer);
logger.info(`Registered serializer: ${key}`);
}
/**
* 批量注册序列化器
*
* @param pluginName - 插件名称
* @param serializers - 序列化器实例数组
*/
public registerMultiple(pluginName: string, serializers: ISerializer[]): void {
for (const serializer of serializers) {
this.register(pluginName, serializer);
}
}
/**
* 注销序列化器
*
* @param pluginName - 插件名称
* @param type - 数据类型
* @returns 是否成功注销
*/
public unregister(pluginName: string, type: string): boolean {
const key = `${pluginName}:${type}`;
const result = this.serializers.delete(key);
if (result) {
logger.info(`Unregistered serializer: ${key}`);
}
return result;
}
/**
* 注销插件的所有序列化器
*
* @param pluginName - 插件名称
*/
public unregisterAll(pluginName: string): void {
const prefix = `${pluginName}:`;
const keysToDelete: string[] = [];
for (const key of this.serializers.keys()) {
if (key.startsWith(prefix)) {
keysToDelete.push(key);
}
}
for (const key of keysToDelete) {
this.serializers.delete(key);
logger.info(`Unregistered serializer: ${key}`);
}
}
/**
* 获取序列化器
*
* @param pluginName - 插件名称
* @param type - 数据类型
* @returns 序列化器实例,如果未找到则返回 undefined
*/
public get(pluginName: string, type: string): ISerializer | undefined {
const key = `${pluginName}:${type}`;
return this.serializers.get(key);
}
/**
* 查找支持指定类型的序列化器
*
* @param type - 数据类型
* @returns 序列化器实例数组
*/
public findByType(type: string): ISerializer[] {
const result: ISerializer[] = [];
for (const [key, serializer] of this.serializers) {
if (key.endsWith(`:${type}`)) {
result.push(serializer);
}
}
return result;
}
/**
* 获取所有序列化器
*
* @returns 序列化器映射表
*/
public getAll(): Map<string, ISerializer> {
return new Map(this.serializers);
}
/**
* 检查序列化器是否已注册
*
* @param pluginName - 插件名称
* @param type - 数据类型
* @returns 是否已注册
*/
public has(pluginName: string, type: string): boolean {
const key = `${pluginName}:${type}`;
return this.serializers.has(key);
}
/**
* 序列化数据
*
* @param pluginName - 插件名称
* @param type - 数据类型
* @param data - 要序列化的数据
* @returns 二进制数据
* @throws 如果序列化器未注册
*/
public serialize<T = any>(pluginName: string, type: string, data: T): Uint8Array {
const serializer = this.get(pluginName, type);
if (!serializer) {
throw new Error(`Serializer not found: ${pluginName}:${type}`);
}
return serializer.serialize(data);
}
/**
* 反序列化数据
*
* @param pluginName - 插件名称
* @param type - 数据类型
* @param data - 二进制数据
* @returns 反序列化后的数据
* @throws 如果序列化器未注册
*/
public deserialize<T = any>(pluginName: string, type: string, data: Uint8Array): T {
const serializer = this.get(pluginName, type);
if (!serializer) {
throw new Error(`Serializer not found: ${pluginName}:${type}`);
}
return serializer.deserialize(data);
}
/**
* 释放资源
*/
public dispose(): void {
this.serializers.clear();
logger.info('SerializerRegistry disposed');
}
}