Sunny Shah
08/07/2025, 12:16 PMValueError: Unable to create hash - objects could not be serialized.
JSON error: Unable to serialize unknown type: <class 'encord.user_client.EncordUserClient'>
Pickle error: cannot pickle 'cryptography.hazmat.bindings._rust.openssl.ed25519.Ed25519PrivateKey' object
This often occurs when task inputs contain objects that cannot be cached like locks, file handles, or other system resources.
To resolve this, you can:
1. Exclude these arguments by defining a custom `cache_key_fn`
2. Disable caching by passing `cache_policy=NO_CACHE`
Marvin
08/07/2025, 12:16 PMMarvin
08/07/2025, 12:17 PMEncordUserClient
instance
2. A cryptography-related private key object (Ed25519PrivateKey
)
These objects contain complex state or system resources that can't be easily converted to a simple format for storage.
Here are three ways to resolve this:
1. Disable caching for the task (simplest solution):
python
from prefect import task
from prefect.tasks import NO_CACHE
@task(cache_policy=NO_CACHE)
def your_task(client, ...):
# your task code here
pass
2. Create a custom cache key function that excludes the problematic arguments:
python
from prefect import task
def custom_cache_key_fn(context, *args, **kwargs):
# Exclude the client from the cache key calculation
# Only use other arguments for caching
cacheable_kwargs = {k: v for k, v in kwargs.items() if k != 'client'}
return str(cacheable_kwargs)
@task(cache_key_fn=custom_cache_key_fn)
def your_task(client, ...):
# your task code here
pass
3. Initialize the client inside the task (if possible):
python
from prefect import task
@task
def your_task(*args, **kwargs):
# Create the client inside the task
client = EncordUserClient(...)
# your task code here
pass
The recommended approach depends on your specific needs:
- If you don't need caching for this task, use option 1 (disable caching)
- If you want to cache based on other parameters but not the client, use option 2 (custom cache key)
- If you can initialize the client inside the task, use option 3 (internal initialization)
Remember that caching is optional in Prefect, and it's perfectly fine to disable it for tasks that work with non-serializable objects. The main goal is to ensure your workflow runs reliably, even if it means sacrificing caching for certain tasks.
Would you like me to provide more specific guidance based on how you're currently using the EncordUserClient
in your task?Sunny Shah
08/07/2025, 12:26 PM