Index: flexoentity/flexo_entity.py
===================================================================
--- flexoentity/flexo_entity.py	(revision 100c1d25edd93042cee640c536afe12aae1ed4c0)
+++ flexoentity/flexo_entity.py	(revision 4a79b76446b26c92cb27fc0805ac45b099f34b9d)
@@ -56,9 +56,10 @@
 from dataclasses import dataclass, field, replace
 from typing import Optional
+from pathlib import Path
 from abc import ABC, abstractmethod
 import hashlib
 
 
-from flexoentity.id_factory import FlexOID, canonical_seed
+from flexoentity.id_factory import FlexOID
 from flexoentity.logger import logger
 
@@ -114,4 +115,5 @@
         return self.name
 
+
 TRANSITIONS = {
     EntityState.DRAFT: [EntityState.APPROVED],
@@ -122,5 +124,4 @@
     EntityState.OBSOLETE: [],
 }
-
 
 
@@ -306,7 +307,11 @@
         return obj
 
-    def to_json(self, *, indent: int | None = None) -> str:
-        """I serialize myself (and my FlexOID) into JSON."""
-        return json.dumps(self.to_dict(), indent=indent, ensure_ascii=False)
+    def to_json(self, indent: int = 2) -> str:
+        """Return a JSON representation including all FlexO metadata."""
+        return json.dumps(self.to_dict(), ensure_ascii=False, indent=indent)
+
+    def to_json_file(self, path):
+        Path(path).write_text(self.to_json(), encoding="utf-8")
+        return path
 
     @classmethod
@@ -315,4 +320,11 @@
         data = json.loads(data_str)
         return cls.from_dict(data)
+
+    @classmethod
+    def from_json_file(cls, filename: str):
+        with open(filename, "r", encoding="utf-8") as f:
+            data = json.load(f)
+        return cls.from_dict(data)
+
 
     def _deserialize_content(self, content_dict):
