Azure / Azure/azure-functions-durable-python

Custom object serialization broken for orchestrator return values

未关闭 适合新手
#568 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
bug fixed-in-v2 P2
主要语言
Python
星标
157
派生
70
平均合并
2 天 10 小时
30 天内合并 PR
2

描述

🐛 **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:
```python
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)

```

2. 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:
https://github.com/Azure/azure-functions-durable-python/blob/15ed958555b9410629f97cd7884d8783cb0e460e/azure/durable_functions/models/TaskOrchestrationExecutor.py#L284

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.

贡献指南

打开贡献指南

调研方向

从 azure/durable_functions/models/TaskOrchestrationExecutor.py 中的 TaskOrchestrationExecutor.get_orchestrator_state_str() 开始,将其 JSON 序列化与 issue 中提到的其他模型或实体进行比较。使用 CustomResult 示例重现该 orchestration,并验证可以返回带有 to_json() 的对象而不会出现 not-serializable 错误。

由索引模型根据 Issue 内容生成。

评估

技术栈
python
领域
backend
Issue 类型
缺陷
难度
2/5
预计耗时
1-3 小时
活跃度
冷清
描述清晰度
描述清楚
新手友好度
75/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。