# Copyright 2026 zhaoxi826 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from typing import Type, TypeVar from pydantic import BaseModel T = TypeVar("T", bound=Type[BaseModel]) def pickle(cls: T) -> T: """ 类装饰器pickle 通过装饰继承了BaseModel的类,用pydantic的高效序列化替代python原生__reduce__魔术方法,实现ray在通讯时的高效序列化 Args: cls: 继承了BaseModel类的类,需要被装饰的对象 Returns: 返回被重写了__reduce__魔术方法的cls类 """ def __reduce__(self): # 1. 序列化:触发 Pydantic-core (Rust) 的极速序列化 data = self.model_dump_json() # 2. 反序列化:告诉 Pickle 重建时调用 cls.model_validate_json return cls.model_validate_json, (data,) cls.__reduce__ = __reduce__ return cls