diff --git a/src/dataclass.rs b/src/dataclass.rs
index 282ba2dc0edafdc6da438a644f3b31da020ad334_c3JjL2RhdGFjbGFzcy5ycw==..a9eff9f72d1e62ae90f6510c38eff135fdd64790_c3JjL2RhdGFjbGFzcy5ycw== 100644
--- a/src/dataclass.rs
+++ b/src/dataclass.rs
@@ -46,6 +46,9 @@
         let fields = ffi!(PyObject_GetAttr(self.ptr, DATACLASS_FIELDS_STR));
         ffi!(Py_DECREF(fields));
         let len = unsafe { PyDict_GET_SIZE(fields) as usize };
+        if unlikely!(len == 0) {
+            return serializer.serialize_map(Some(0)).unwrap().end();
+        }
         let mut map = serializer.serialize_map(None).unwrap();
         let mut pos = 0isize;
         let mut str_size: pyo3::ffi::Py_ssize_t = 0;
diff --git a/src/encode.rs b/src/encode.rs
index 282ba2dc0edafdc6da438a644f3b31da020ad334_c3JjL2VuY29kZS5ycw==..a9eff9f72d1e62ae90f6510c38eff135fdd64790_c3JjL2VuY29kZS5ycw== 100644
--- a/src/encode.rs
+++ b/src/encode.rs
@@ -366,6 +366,9 @@
                 if !dict.is_null() {
                     ffi!(Py_DECREF(dict));
                     let len = unsafe { PyDict_GET_SIZE(dict) as usize };
+                    if unlikely!(len == 0) {
+                        return serializer.serialize_map(Some(0)).unwrap().end();
+                    }
                     let mut map = serializer.serialize_map(None).unwrap();
                     let mut pos = 0isize;
                     let mut str_size: pyo3::ffi::Py_ssize_t = 0;
diff --git a/test/test_dataclass.py b/test/test_dataclass.py
index 282ba2dc0edafdc6da438a644f3b31da020ad334_dGVzdC90ZXN0X2RhdGFjbGFzcy5weQ==..a9eff9f72d1e62ae90f6510c38eff135fdd64790_dGVzdC90ZXN0X2RhdGFjbGFzcy5weQ== 100644
--- a/test/test_dataclass.py
+++ b/test/test_dataclass.py
@@ -15,6 +15,18 @@
 
 
 @dataclass
+class EmptyDataclass:
+    pass
+
+
+@dataclass
+class EmptyDataclassSlots:
+    __slots__ = ()
+    pass
+
+
+
+@dataclass
 class Dataclass1:
     name: str
     number: int
@@ -115,6 +127,22 @@
         with self.assertRaises(orjson.JSONEncodeError):
             orjson.dumps(obj1)
 
+    def test_dataclass_empty(self):
+        """
+        dumps() no attributes
+        """
+        self.assertEqual(
+            orjson.dumps(EmptyDataclass()), b"{}",
+        )
+
+    def test_dataclass_empty_slots(self):
+        """
+        dumps() no attributes slots
+        """
+        self.assertEqual(
+            orjson.dumps(EmptyDataclassSlots()), b"{}",
+        )
+
     def test_dataclass_default_arg(self):
         """
         dumps() dataclass default arg