diff --git a/src/main/jastadd/Analysis.jrag b/src/main/jastadd/Analysis.jrag
index 48f1e58e5a61f8a77b0ba84eb93ba99a8c66427c..941256ed7fbdcd994a9e0b1f5c4a3282fc885e9f 100644
--- a/src/main/jastadd/Analysis.jrag
+++ b/src/main/jastadd/Analysis.jrag
@@ -118,6 +118,15 @@ aspect ComponentAnalysis {
     // TODO
     return true;
   }
+
+  syn boolean Component.isList() = false;
+  eq ListComponent.isList() = true;
+
+  syn boolean Component.isOpt() = false;
+  eq OptComponent.isOpt() = true;
+
+  syn boolean Component.isNullable() = false;
+  eq TokenComponent.isNullable() = !"float double int short long char byte boolean".contains(getTypeUse().getID());
 }
 
 aspect InstanceSupplier {
diff --git a/src/main/jastadd/Backend.jadd b/src/main/jastadd/Backend.jadd
index 528e4530ee0a14863ab1d56c2bb993c3a3a18f00..b4d174dba4a7f93b7b3cf99bf16b855dade2396e 100644
--- a/src/main/jastadd/Backend.jadd
+++ b/src/main/jastadd/Backend.jadd
@@ -1051,10 +1051,20 @@ aspect Serializer {
     sb.append(ind(4) + "g.writeObjectFieldStart(fieldName);\n");
     sb.append(ind(3) + "}\n");
     sb.append(ind(3) + "g.writeStringField(\"" + jsonTypeKey + "\", \"" + getID() + "\");\n");
+    sb.append(ind(3) + "if (__uid() == null) throw new SerializationException(\"The unique identifier of " + getID() + " is missing.\");\n");
     sb.append(ind(3) + "g.writeStringField(\"id\", __uid());\n");
     if (componentsTransitive().size() > 0) {
       sb.append(ind(3) + "g.writeObjectFieldStart(\"children\");\n");
       for (Component child : componentsTransitive()) {
+        if (child.isNullable()) {
+          String componentAccessor = child.getID();
+          if (child.isList()) {
+            componentAccessor += "List";
+          } else if (child.isOpt()) {
+            componentAccessor += "Opt";
+          }
+          sb.append(ind(3) + "if (get" + componentAccessor + "() == null) throw new SerializationException(\"The component " + child.getID() + " of " + getID() + " is missing.\");\n");
+        }
         child.serialize(sb, 3);
       }
       sb.append(ind(3) + "g.writeEndObject(); // children\n");