diff --git a/docs/coder.rst b/docs/coder.rst
index 6fa4fe5..c5f7f7e 100644
--- a/docs/coder.rst
+++ b/docs/coder.rst
@@ -45,6 +45,7 @@ modern Python world.
     ring.coder.bypass_coder
     ring.coder.JsonCoder
     ring.coder.pickle_coder
+    ring.coder.DataclassCoder
 
 :see: :mod:`ring.coder` for the module including pre-registered coders.
 
diff --git a/docs/quickstart.rst b/docs/quickstart.rst
index 43f1960..ddeb26a 100644
--- a/docs/quickstart.rst
+++ b/docs/quickstart.rst
@@ -3,7 +3,7 @@ Quickstart
 
 To start, remember the philosophy of **Ring** is a human-friendly high-level
 interface *with* transparent and concrete low-level access. You probably be
-able to access most of the levels of **Ring** you want.
+able to access most of the level of **Ring** you want.
 
 
 Installation
@@ -151,13 +151,12 @@ Let's consider using external cache storage instead of :class:`lru`.
 
 **Ring** includes common cache storage supports. `Memcached` is one of the
 popular cache storage. `Memcached` itself is out of the Python world. You must
-install and run it to let your python code connects there. Fortunately,
-because `Memcached` is very popular, it is well-packaged on most of the
-platforms. Check how to install it on your platform.
+install and run it to let your python code connects there. Because `Memcached`
+is very popular, it is well-packaged on most of the platforms. Check how to
+install it on your platform.
 
-:note: For example, ``apt install memcached`` for Debian/Ubuntu.
-    ``yum install memcached`` for CentOS/RHEL. ``brew install memcache`` for
-    macOS with Homebrew_.
+:note: ``apt install memcached`` for Debian/Ubuntu. ``yum install memcached``
+       for CentOS/RHEL ``brew install memcache`` for macOS with Homebrew_.
 
 Once you installed it, do not forget to start it.
 
diff --git a/ring/coder.py b/ring/coder.py
index beba8a0..da7e55a 100644
--- a/ring/coder.py
+++ b/ring/coder.py
@@ -7,6 +7,7 @@ stored cache data.
 import abc
 import six
 from collections import namedtuple
+
 try:
     import ujson as json_mod
 except ImportError:
@@ -17,6 +18,11 @@ try:
 except ImportError:
     import pickle as pickle_mod
 
+try:
+    import dataclasses
+except ImportError:
+    dataclasses = None
+
 
 @six.add_metaclass(abc.ABCMeta)
 class Coder(object):
@@ -63,7 +69,7 @@ class Registry(object):
     :see: :func:`ring.coder.registry` for default registry instance.
     """
 
-    __slots__ = ('coders', )
+    __slots__ = ('coders',)
 
     def __init__(self):
         self.coders = {}
@@ -113,7 +119,6 @@ def bypass(x):
 #: encode and decode functions bypass the given parameter.
 bypass_coder = bypass, bypass
 
-
 #: Pickle coder.
 #:
 #: encode is :func:`pickle.dumps` and decode is :func:`pickle.loads`.
@@ -139,6 +144,23 @@ class JsonCoder(Coder):
         return json_mod.loads(binary.decode('utf-8'))
 
 
+if dataclasses:
+    class DataclassCoder(Coder):
+
+        @staticmethod
+        def encode(data):
+            """Serialize dataclass object to json encoded dictionary"""
+            target_dict = (type(data).__name__, dataclasses.asdict(data))
+            return JsonCoder.encode(target_dict)
+
+        @staticmethod
+        def decode(binary):
+            """Deserialize json encoded dictionary to dataclass object"""
+            name, fields = JsonCoder.decode(binary)
+            dataclass = dataclasses.make_dataclass(name, [(key, type(value)) for key, value in fields.items()])
+            instance = dataclass(**fields)
+            return instance
+
 #: The default coder registry with pre-registered coders.
 #: Built-in coders are registered by default.
 #:
@@ -147,3 +169,6 @@ registry = Registry()
 registry.register(None, bypass_coder)
 registry.register('json', JsonCoder())
 registry.register('pickle', pickle_coder)
+
+if dataclasses:
+    registry.register('dataclass', DataclassCoder())

dataclass coder
https://pypi.org/project/dataclasses-serialization/
diff --git a/tests/test_coder.py b/tests/test_coder.py
index 5dd740e..f185c6f 100644
--- a/tests/test_coder.py
+++ b/tests/test_coder.py
@@ -1,3 +1,4 @@
+import sys
 
 import ring
 from ring.coder import (
@@ -82,6 +83,21 @@ def test_ring_bare_coder():
     assert f() == 10
 
 
+if sys.version_info >= (3, 7):
+    from tests._test_module_py37 import DataClass
+
+    def test_dataclass_coder():
+        coder = default_registry.get('dataclass')
+        dataclass = DataClass('name', 1, {'test': 1})
+        encoded_dataclass = coder.encode(dataclass)
+        assert b'["DataClass", {"name": "name", "my_int": 1, "my_dict": {"test": 1}}]' == encoded_dataclass
+        decoded_dataclass = coder.decode(encoded_dataclass)
+        assert 'DataClass' == type(decoded_dataclass).__name__
+        assert decoded_dataclass.name == 'name'
+        assert decoded_dataclass.my_int == 1
+        assert decoded_dataclass.my_dict == {'test': 1}
+
+
 def test_unexisting_coder():
     cache = {}
 

pip install -e .[dev]
parse_log_pytest
pytest
pytest
3.7
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
aiomcache==0.8.1
aioredis==2.0.1
alabaster==0.7.13
asgiref==3.7.2
async-timeout==4.0.3
attrs @ file:///croot/attrs_1668696182826/work
Babel==2.14.0
certifi @ file:///croot/certifi_1671487769961/work/certifi
charset-normalizer==3.4.1
coverage==7.2.7
diskcache==5.6.3
Django==3.2.25
docutils==0.19
flit_core @ file:///opt/conda/conda-bld/flit-core_1644941570762/work/source/flit_core
idna==3.10
imagesize==1.4.1
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1648562407465/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
Jinja2==3.1.6
MarkupSafe==2.1.5
mock==5.2.0
packaging @ file:///croot/packaging_1671697413597/work
patch==1.16
pluggy @ file:///tmp/build/80754af9/pluggy_1648042572264/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
Pygments==2.17.2
pylibmc==1.6.3
pymemcache==4.0.0
pytest==7.1.2
pytest-asyncio==0.21.2
pytest-cov==4.1.0
pytest-lazy-fixture==0.5.2
python3-memcached==1.51
pytz==2025.2
redis==5.0.8
requests==2.31.0
-e git+https://github.com/youknowone/ring.git@14a2ed761c5ce773eea9d9ca076f48203c561fb2#egg=ring
six==1.17.0
snowballstemmer==2.2.0
Sphinx==5.3.0
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.5
sqlparse==0.4.4
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
typing_extensions @ file:///croot/typing_extensions_1669924550328/work
urllib3==2.0.7
wirerope==1.0.0
zipp @ file:///croot/zipp_1672387121353/work

name: ring
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=22.1.0=py37h06a4308_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - flit-core=3.6.0=pyhd3eb1b0_0
  - importlib-metadata=4.11.3=py37h06a4308_0
  - importlib_metadata=4.11.3=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=22.0=py37h06a4308_0
  - pip=22.3.1=py37h06a4308_0
  - pluggy=1.0.0=py37h06a4308_1
  - py=1.11.0=pyhd3eb1b0_0
  - pytest=7.1.2=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py37h06a4308_0
  - typing_extensions=4.4.0=py37h06a4308_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.11.0=py37h06a4308_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - aiomcache==0.8.1
      - aioredis==2.0.1
      - alabaster==0.7.13
      - asgiref==3.7.2
      - async-timeout==4.0.3
      - babel==2.14.0
      - charset-normalizer==3.4.1
      - coverage==7.2.7
      - diskcache==5.6.3
      - django==3.2.25
      - docutils==0.19
      - idna==3.10
      - imagesize==1.4.1
      - jinja2==3.1.6
      - markupsafe==2.1.5
      - mock==5.2.0
      - patch==1.16
      - pygments==2.17.2
      - pylibmc==1.6.3
      - pymemcache==4.0.0
      - pytest-asyncio==0.21.2
      - pytest-cov==4.1.0
      - pytest-lazy-fixture==0.5.2
      - python3-memcached==1.51
      - pytz==2025.2
      - redis==5.0.8
      - requests==2.31.0
      - six==1.17.0
      - snowballstemmer==2.2.0
      - sphinx==5.3.0
      - sphinxcontrib-applehelp==1.0.2
      - sphinxcontrib-devhelp==1.0.2
      - sphinxcontrib-htmlhelp==2.0.0
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==1.0.3
      - sphinxcontrib-serializinghtml==1.1.5
      - sqlparse==0.4.4
      - urllib3==2.0.7
      - wirerope==1.0.0
prefix: /opt/conda/envs/ring

tests/test_coder.py::test_dataclass_coder
tests/test_coder.py::test_coder_pickle
tests/test_coder.py::test_coder_registry tests/test_coder.py::test_coder_json tests/test_coder.py::test_ring_bare_coder tests/test_coder.py::test_unexisting_coder tests/test_coder.py::test_coderize[JsonCoder] tests/test_coder.py::test_invalid_coderize
ring/coder.py docs/quickstart.rst docs/coder.rst
ring/coder.py docs/quickstart.rst docs/coder.rst