Skip to content

Custom object serialization broken for orchestrator return values #568

@hoesler

Description

@hoesler

🐛 Describe the bug
Azure Durable Functions Python SDK fails to serialize custom objects that implement a to_json() method when returning from orchestrator functions. The error "Object of type [CustomClass] is not JSON serializable" is raised.

🤔 Expected behavior
Custom objects implementing a to_json() method should be automatically serialized when returned from orchestrator functions.

Steps to reproduce
Basic orchestration with custom return types.

  1. Create a custom class with to_json() and from_json() methods:
from dataclasses import dataclass

import azure.durable_functions as df
import azure.functions as func

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

@dataclass
class CustomResult():
  message: str
  success: bool = True

  def to_json(self):
      return {"message": self.message, "success": self.success}

  @classmethod
  def from_json(cls, data):
      return cls(message=data["message"], success=data["success"])

@app.orchestration_trigger(context_name="context")
def orchestrator_function(context: df.DurableOrchestrationContext):
  return CustomResult(message="Hello from orchestrator!", success=True)

@app.route(route="test", methods=["GET"])
@app.durable_client_input(client_name="client")
async def http_start_conversion(req: func.HttpRequest, client: df.DurableOrchestrationClient) -> func.HttpResponse:
  instance_id = await client.start_new(
      orchestration_function_name="orchestrator_function"
  )

  return client.create_check_status_response(req, instance_id)
  1. Execute the orchestration - it will fail with "Object of type CustomResult is not JSON serializable"

Environment: Running locally with
Azure Functions Core Tools Version: 4.1.0
azure-functions-durable: 1.3.2

Root cause: In TaskOrchestrationExecutor.get_orchestrator_state_str(), the code calls dumps without a default argument:

But should call:
json.dumps(self._data, default=_serialize_custom_object) as in other models or entities.

If deployed to Azure
Didn't test yet. Since the bug is in the Python SDK code itself, I expect the same issue to occur.

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