diff --git a/swh/model/identifiers.py b/swh/model/identifiers.py
index 372bc7c5e560d42c2820ee0db359eb444ee4892f..e1cf0dfe3b80fe40f0df23beb3c493098f82c2fd 100644
--- a/swh/model/identifiers.py
+++ b/swh/model/identifiers.py
@@ -723,6 +723,9 @@ class SWHID:
     def check_object_id(self, attribute, value):
         validate_sha1(value)  # can raise if invalid hash
 
+    def to_dict(self) -> Dict[str, Any]:
+        return attr.asdict(self)
+
     def __str__(self) -> str:
         o = _object_type_map.get(self.object_type)
         assert o
@@ -856,4 +859,4 @@ def parse_persistent_identifier(persistent_id: str) -> PersistentId:
     .. deprecated:: 0.3.8
         Use :func:`swh.model.identifiers.parse_swhid` instead
     """
-    return PersistentId(**attr.asdict(parse_swhid(persistent_id)))
+    return PersistentId(**parse_swhid(persistent_id).to_dict())
diff --git a/swh/model/tests/test_identifiers.py b/swh/model/tests/test_identifiers.py
index c03b9eff0e9ebebaac06994be8e94ee1e4431736..5acbd2d38c19466bda2c14b16595ac9d3d41cc0e 100644
--- a/swh/model/tests/test_identifiers.py
+++ b/swh/model/tests/test_identifiers.py
@@ -915,6 +915,16 @@ class SnapshotIdentifier(unittest.TestCase):
             )
             actual_result = identifiers.parse_swhid(swhid)
             self.assertEqual(actual_result, expected_result)
+            self.assertEqual(
+                expected_result.to_dict(),
+                {
+                    "namespace": "swh",
+                    "scheme_version": _version,
+                    "object_type": _type,
+                    "object_id": _hash,
+                    "metadata": _metadata,
+                },
+            )
 
     def test_parse_swhid_parsing_error(self):
         for swhid in [