Skip to content

Serialization/Deserialization doesn't handle Generics and generates Non-deterministic workflow error #572

@jgabaud

Description

@jgabaud

🐛 Describe the bug
When a Pydantic Generic object is returned in an activity function azure.functions._durable_functions._serialize_custom_object returns "class": "ClassName[GenericSpecificClass]". When azure.functions._durable_functions._deserialize_custom_object is called in the calling orchestrator, getattr(module, "ClassName[GenericSpecificClass]") fails: ClassName exists but not the specialized "ClassName[GenericSpecificClass]".

🤔 Expected behavior
Serialization and deserialization handles Generics.

Current behaviour
Deserialization fails with AttributeError: module 'xxx.xxx' has not attribute 'ClassName[GenericSpecificClass]'and produces a Non-Deterministic Workflow error

Steps to reproduce

from pydantic import BaseModel
from typing import Generic
import azure.functions as func
import azure.durable_functions as df

class A(BaseModel, Generic[T]):
    a: T

    def to_json():
        return self.model_dump(mode="json")

    @classmethod
    def from_json(cls, data: dict):
        return cls(**data)



myApp = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)

@myApp.orchestration_trigger(context_name="context")
def orchestrator_function(context: df.DurableOrchestrationContext):
    x = yield context.call_activity("hello", None)

@myApp.activity_trigger(input_name="params")
def hello(params):
    return A[str](a="xxx")

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions