Source code for agentscope.serialize

# -*- coding: utf-8 -*-
"""The serialization module for the package."""
import importlib
import json
from typing import Any


def _default_serialize(obj: Any) -> Any:
    """Serialize the object when `json.dumps` cannot handle it."""
    if hasattr(obj, "__module__") and hasattr(obj, "__class__"):
        # To avoid circular import, we hard code the module name here
        if (
            obj.__module__ == "agentscope.message.msg"
            and obj.__class__.__name__ == "Msg"
        ):
            return obj.to_dict()

    return obj


def _deserialize_hook(data: dict) -> Any:
    """Deserialize the JSON string to an object, including Msg object in
    AgentScope."""
    module_name = data.get("__module__", None)
    class_name = data.get("__name__", None)

    if module_name is not None and class_name is not None:
        module = importlib.import_module(module_name)
        cls = getattr(module, class_name)
        if hasattr(cls, "from_dict"):
            return cls.from_dict(data)
    return data


[docs] def serialize(obj: Any) -> str: """Serialize the object to a JSON string. For AgentScope, this function supports to serialize `Msg` object for now. """ # TODO: We leave the serialization of agents in next PR return json.dumps(obj, ensure_ascii=False, default=_default_serialize)
[docs] def deserialize(s: str) -> Any: """Deserialize the JSON string to an object For AgentScope, this function supports to serialize `Msg` object for now. """ # TODO: We leave the serialization of agents in next PR return json.loads(s, object_hook=_deserialize_hook)
[docs] def is_serializable(obj: Any) -> bool: """Check if the object is serializable in the scope of AgentScope.""" try: serialize(obj) return True except Exception: return False