Reorganize Serializer class layout
This commit is contained in:
parent
7af137867b
commit
dc253425f8
100
dumper.py
100
dumper.py
@ -54,50 +54,12 @@ class Serializer(ABC):
|
||||
|
||||
serializer_map = {}
|
||||
|
||||
# --- Getters for sub-serializers ---
|
||||
|
||||
@classmethod
|
||||
def get_serializer_map(cls) -> dict[type[bpy.types.bpy_struct], type[Serializer]]:
|
||||
"""Get the serializer map, stored in a class variable for simple caching"""
|
||||
if not cls.serializer_map:
|
||||
for subclass in utils.all_subclasses(Serializer):
|
||||
assert hasattr(subclass, "bl_type")
|
||||
cls.serializer_map[subclass.bl_type] = subclass
|
||||
|
||||
return cls.serializer_map
|
||||
|
||||
@classmethod
|
||||
def get_serializer(cls, bl_object: bpy.types.bpy_struct) -> type[Serializer]:
|
||||
"""Get the closest corresponding serializer for a given Blender object using its MRO"""
|
||||
serializer_map = cls.get_serializer_map()
|
||||
|
||||
bl_type = type(bl_object.bl_rna.type_recast())
|
||||
|
||||
for bl_parents in bl_type.mro():
|
||||
if bl_parents in serializer_map:
|
||||
return serializer_map[bl_parents]
|
||||
|
||||
# Fallback to base Serializer if no matches are found
|
||||
return Serializer
|
||||
|
||||
# --- Properties to (de)serialize ---
|
||||
|
||||
@classmethod
|
||||
def get_serialized_properties(cls, obj: bpy.types.bpy_struct | Any):
|
||||
serialized_properties: list[BlenderProperty] = [
|
||||
BlenderProperty(rep=prop, attr=getattr(obj, prop.identifier))
|
||||
for prop in obj.bl_rna.properties
|
||||
if not prop.identifier.startswith("bl_") # Exclude internal Blender properties
|
||||
and prop.identifier not in cls.prop_blacklist # Additional blacklist filtering
|
||||
]
|
||||
|
||||
if cls.prop_whitelist: # Additional whitelist, applied after the blacklist
|
||||
serialized_properties: list[BlenderProperty] = [
|
||||
prop for prop in serialized_properties
|
||||
if prop.rep.identifier in cls.prop_whitelist
|
||||
]
|
||||
|
||||
return serialized_properties
|
||||
@abstractmethod
|
||||
def construct_bl_object(cls, data: dict):
|
||||
"""Abstract method to construct a Serializer's specific Blender Object"""
|
||||
print("DEBUG: construct_bl_object called on Base Serializer, shouldn't happen")
|
||||
return None
|
||||
|
||||
# --- Serialization ---
|
||||
|
||||
@ -226,13 +188,6 @@ class Serializer(ABC):
|
||||
if hasattr(target_bl_prop.attr, "update"):
|
||||
target_bl_prop.attr.update()
|
||||
|
||||
@classmethod
|
||||
@abstractmethod
|
||||
def construct_bl_object(cls, data: dict):
|
||||
"""Abstract method to construct a Serializer's specific Blender Object"""
|
||||
print("DEBUG: construct_bl_object called on Base Serializer, shouldn't happen")
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
def deserialize_collection(cls, stored_value: Any, bl_coll: bpy.types.bpy_prop_collection, bl_pointers_ref: dict):
|
||||
# Static collection case
|
||||
@ -318,6 +273,51 @@ class Serializer(ABC):
|
||||
|
||||
return sorted_data
|
||||
|
||||
# --- Getters for sub-serializers ---
|
||||
|
||||
@classmethod
|
||||
def get_serializer_map(cls) -> dict[type[bpy.types.bpy_struct], type[Serializer]]:
|
||||
"""Get the serializer map, stored in a class variable for simple caching"""
|
||||
if not cls.serializer_map:
|
||||
for subclass in utils.all_subclasses(Serializer):
|
||||
assert hasattr(subclass, "bl_type")
|
||||
cls.serializer_map[subclass.bl_type] = subclass
|
||||
|
||||
return cls.serializer_map
|
||||
|
||||
@classmethod
|
||||
def get_serializer(cls, bl_object: bpy.types.bpy_struct) -> type[Serializer]:
|
||||
"""Get the closest corresponding serializer for a given Blender object using its MRO"""
|
||||
serializer_map = cls.get_serializer_map()
|
||||
|
||||
bl_type = type(bl_object.bl_rna.type_recast())
|
||||
|
||||
for bl_parents in bl_type.mro():
|
||||
if bl_parents in serializer_map:
|
||||
return serializer_map[bl_parents]
|
||||
|
||||
# Fallback to base Serializer if no matches are found
|
||||
return Serializer
|
||||
|
||||
# --- Properties to (de)serialize ---
|
||||
|
||||
@classmethod
|
||||
def get_serialized_properties(cls, obj: bpy.types.bpy_struct | Any):
|
||||
serialized_properties: list[BlenderProperty] = [
|
||||
BlenderProperty(rep=prop, attr=getattr(obj, prop.identifier))
|
||||
for prop in obj.bl_rna.properties
|
||||
if not prop.identifier.startswith("bl_") # Exclude internal Blender properties
|
||||
and prop.identifier not in cls.prop_blacklist # Additional blacklist filtering
|
||||
]
|
||||
|
||||
if cls.prop_whitelist: # Additional whitelist, applied after the blacklist
|
||||
serialized_properties: list[BlenderProperty] = [
|
||||
prop for prop in serialized_properties
|
||||
if prop.rep.identifier in cls.prop_whitelist
|
||||
]
|
||||
|
||||
return serialized_properties
|
||||
|
||||
# class NodeSocket(Serializer):
|
||||
# bl_type = bpy.types.NodeSocket
|
||||
# prop_blacklist = Serializer.prop_blacklist + (
|
||||
|
Loading…
x
Reference in New Issue
Block a user