diff --git a/gson-compile-processor/src/main/java/io/gitlab/jfronny/gson/compile/processor/GsonCompileProcessor.java b/gson-compile-processor/src/main/java/io/gitlab/jfronny/gson/compile/processor/GsonCompileProcessor.java index a6b99b7..7f3506e 100644 --- a/gson-compile-processor/src/main/java/io/gitlab/jfronny/gson/compile/processor/GsonCompileProcessor.java +++ b/gson-compile-processor/src/main/java/io/gitlab/jfronny/gson/compile/processor/GsonCompileProcessor.java @@ -308,31 +308,37 @@ public class GsonCompileProcessor extends AbstractProcessor2 { code.addStatement("writer.beginObject()"); for (Property.Field param : properties.fields) { if (Properties.containsName(properties.getters, param)) continue; - generateComments(param, code); - code.addStatement("writer.name($S)", getSerializedName(param)); Runnable writeGet = () -> code.add("value.$N", param.getCallableName()); if (param.getType().getKind().isPrimitive()) { + generateComments(param, code); + code.addStatement("writer.name($S)", getSerializedName(param)); Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, writeGet); } else { - code.beginControlFlow("if (value.$N == null)", param.getCallableName()) - .addStatement("if (writer.getSerializeNulls()) writer.nullValue()") - .nextControlFlow("else"); + code.beginControlFlow("if (value.$N != null || writer.getSerializeNulls())", param.getCallableName()); + generateComments(param, code); + code.addStatement("writer.name($S)", getSerializedName(param)); + code.addStatement("if (value.$N == null) writer.nullValue()", param.getCallableName()); + code.beginControlFlow("else"); Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, writeGet); code.endControlFlow(); + code.endControlFlow(); } } for (Property.Getter param : properties.getters) { - generateComments(param, code); - code.addStatement("writer.name($S)", getSerializedName(param)); if (param.getType().getKind().isPrimitive()) { + generateComments(param, code); + code.addStatement("writer.name($S)", getSerializedName(param)); Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, () -> code.add("value.$N()", param.getCallableName())); } else { - code.addStatement("$T $L$N = value.$N()", param.getType(), "$", param.getCallableName(), param.getCallableName()) - .beginControlFlow("if ($L$N == null)", "$", param.getCallableName()) - .addStatement("if (writer.getSerializeNulls()) writer.nullValue()") - .nextControlFlow("else"); + code.addStatement("$T $L$N = value.$N()", param.getType(), "$", param.getCallableName(), param.getCallableName()); + code.beginControlFlow("if ($L$N != null || writer.getSerializeNulls())", "$", param.getCallableName()); + generateComments(param, code); + code.addStatement("writer.name($S)", getSerializedName(param)); + code.addStatement("if ($L$N == null) writer.nullValue()", "$", param.getCallableName()); + code.beginControlFlow("else"); Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, () -> code.add("$L$N", "$", param.getCallableName())); code.endControlFlow(); + code.endControlFlow(); } } code.addStatement("writer.endObject()");