[csharp] Constructor handling for serialization

Resolving an issue with serializing classes that contain required
properties. When the only constructor has defaulted parameters, no
parameterless constructor is generated but JSON.Net attempts to call
the missing constructor on deserialization (because of DataContract).

See: https://manski.net/2014/10/net-serializers-comparison-chart/

The fix here is to create a protected constructor, annotate it with
JsonConstructorAttribute to inform JSON.Net it is the constructor to use
during serialization, then provide settings that explicitly allow
JSON.Net to access non-public constructors during serialiazation.
This commit is contained in:
Jim Schubert
2016-05-07 22:22:48 -04:00
parent 084f15fc2e
commit 618f4bdd39
4 changed files with 16 additions and 2 deletions

View File

@@ -27,7 +27,7 @@ public class CodegenModel {
public Set<String> allMandatory;
public Set<String> imports = new TreeSet<String>();
public Boolean hasVars, emptyVars, hasMoreModels, hasEnums, isEnum;
public Boolean hasVars, emptyVars, hasMoreModels, hasEnums, isEnum, hasRequired;
public ExternalDocs externalDocs;
public Map<String, Object> vendorExtensions;

View File

@@ -2432,6 +2432,7 @@ public class DefaultCodegen {
private void addVars(CodegenModel m, Map<String, Property> properties, List<String> required,
Map<String, Property> allProperties, List<String> allRequired) {
m.hasRequired = false;
if (properties != null && !properties.isEmpty()) {
m.hasVars = true;
m.hasEnums = false;
@@ -2470,6 +2471,7 @@ public class DefaultCodegen {
} else {
final CodegenProperty cp = fromProperty(key, prop);
cp.required = mandatory.contains(key) ? true : null;
m.hasRequired = Boolean.TRUE.equals(m.hasRequired) || Boolean.TRUE.equals(cp.required);
if (cp.isEnum) {
// FIXME: if supporting inheritance, when called a second time for allProperties it is possible for
// m.hasEnums to be set incorrectly if allProperties has enumerations but properties does not.