Skip to content

Commit

Permalink
added custom dict serializer
Browse files Browse the repository at this point in the history
  • Loading branch information
fzumstein committed Feb 26, 2025
1 parent 6efa0b9 commit 77b6d6f
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 1 deletion.
7 changes: 6 additions & 1 deletion app/serializers/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import json

from . import default_serializer, numpy_serializer, pandas_serializer
from . import (
default_serializer,
dictionary_serializer,
numpy_serializer,
pandas_serializer,
)
from .framework import Serializer, custom_encoder, serializers


Expand Down
25 changes: 25 additions & 0 deletions app/serializers/dictionary_serializer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from .framework import Serializer, custom_decoder


class DictionarySerializer(Serializer):
name = "custom_dict_serializer"

@classmethod
def serialize(cls, obj):
# Convert dictionary with non-string keys (e.g., datetime) to a list of
# [key, value] pairs
items = [[k, v] for k, v in obj.items()]
return {
"data": items,
"serializer": cls.name,
}

@classmethod
def deserialize(cls, payload):
# Convert back from list of pairs to dictionary
items = payload["data"]
return {custom_decoder(k): custom_decoder(v) for k, v in items}


# Register the serializer for dict type
DictionarySerializer.register(dict)
6 changes: 6 additions & 0 deletions tests/test_serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,12 @@ def test_dict_of_ndarray():
assert_array_equal(data1["arr1"], data2["arr2"])


def test_dict_with_datetime_keys():
assert {dt.datetime(2000, 1, 1): dt.datetime(2000, 1, 1)} == deserialize(
serialize({dt.datetime(2000, 1, 1): dt.datetime(2000, 1, 1)})
)


def test_list_of_ndarray():
arr1 = np.array([[1.1, 2.2, 3.3], [4.4, 5.5, 6.6]])
arr2 = np.array([[1.1, 2.2, 3.3], [4.4, 5.5, 6.6]])
Expand Down

0 comments on commit 77b6d6f

Please sign in to comment.