private JsonAdditionalPropertiesSerialization?CreateAdditionalProperties(ObjectSchema objectSchema, ObjectType objectType)
        {
            var inheritedDictionarySchema = objectSchema.Parents !.All.OfType <DictionarySchema>().FirstOrDefault();

            ObjectTypeProperty?additionalPropertiesProperty = null;

            foreach (var obj in objectType.EnumerateHierarchy())
            {
                additionalPropertiesProperty = obj.AdditionalPropertiesProperty;
                if (additionalPropertiesProperty != null)
                {
                    break;
                }
            }

            if (inheritedDictionarySchema == null || additionalPropertiesProperty == null)
            {
                return(null);
            }

            var valueSerialization = BuildSerialization(
                inheritedDictionarySchema.ElementType,
                TypeFactory.GetElementType(additionalPropertiesProperty.Declaration.Type));

            return(new JsonAdditionalPropertiesSerialization(
                       additionalPropertiesProperty,
                       valueSerialization,
                       new CSharpType(typeof(Dictionary <,>), additionalPropertiesProperty.Declaration.Type.Arguments)));
        }
        private XmlObjectSerialization BuildXmlObjectSerialization(ObjectSchema objectSchema, ObjectType objectType)
        {
            List <XmlObjectElementSerialization>   elements       = new List <XmlObjectElementSerialization>();
            List <XmlObjectAttributeSerialization> attributes     = new List <XmlObjectAttributeSerialization>();
            List <XmlObjectArraySerialization>     embeddedArrays = new List <XmlObjectArraySerialization>();

            foreach (var objectTypeLevel in objectType.EnumerateHierarchy())
            {
                foreach (ObjectTypeProperty objectProperty in objectTypeLevel.Properties)
                {
                    var property = objectProperty.SchemaProperty;
                    if (property == null)
                    {
                        continue;
                    }

                    var name        = property.SerializedName;
                    var isAttribute = property.Schema.Serialization?.Xml?.Attribute == true;

                    if (isAttribute)
                    {
                        attributes.Add(
                            new XmlObjectAttributeSerialization(
                                name,
                                objectProperty,
                                BuildXmlValueSerialization(property.Schema, objectProperty.Declaration.Type)
                                )
                            );
                    }
                    else
                    {
                        XmlElementSerialization valueSerialization = BuildXmlElementSerialization(property.Schema, objectProperty.Declaration.Type, name, false);

                        if (valueSerialization is XmlArraySerialization arraySerialization)
                        {
                            embeddedArrays.Add(new XmlObjectArraySerialization(objectProperty, arraySerialization));
                        }
                        else
                        {
                            elements.Add(
                                new XmlObjectElementSerialization(
                                    objectProperty,
                                    valueSerialization
                                    )
                                );
                        }
                    }
                }
            }

            return(new XmlObjectSerialization(
                       objectSchema.Serialization?.Xml?.Name ?? objectSchema.Language.Default.Name,
                       objectType.Type, elements.ToArray(), attributes.ToArray(), embeddedArrays.ToArray()
                       ));
        }
        private JsonObjectSerialization BuildJsonObjectSerialization(ObjectSchema objectSchema, ObjectType objectType)
        {
            PropertyBag propertyBag = new PropertyBag();

            foreach (var objectTypeLevel in objectType.EnumerateHierarchy())
            {
                foreach (var objectTypeProperty in objectTypeLevel.Properties)
                {
                    var schemaProperty = objectTypeProperty.SchemaProperty;
                    if (schemaProperty != null)
                    {
                        propertyBag.Properties.Add(schemaProperty);
                    }
                }
            }

            PopulatePropertyBag(propertyBag, 0);
            return(new JsonObjectSerialization(
                       objectType.Type,
                       GetPropertySerializationsFromBag(propertyBag, objectType).ToArray(),
                       CreateAdditionalProperties(objectSchema, objectType)));
        }