Example #1
0
        public override bool Serialize(object obj, StringBuilder output, int indentation = 1, XMLRecursionChecker recursionChecker = null, string fieldName = null)
        {
            if (obj == null)
            {
                return(false);
            }

            // Pop a reference to check if this type holds a recursive reference.
            recursionChecker ??= new XMLRecursionChecker();
            if (recursionChecker.PushReference(obj))
            {
                Engine.Log.Warning($"Recursive reference in field {fieldName}.", MessageSource.XML);
                recursionChecker.PopReference(obj);
                return(true);
            }

            // Handle field value being of inherited type.
            XMLComplexTypeHandler typeHandler = GetInheritedTypeHandler(obj, out string inheritedType) ?? this;

            output.AppendJoin(XMLFormat.IndentChar, new string[indentation]);
            fieldName ??= TypeName;
            output.Append(inheritedType == null ? $"<{fieldName}>\n" : $"<{fieldName} type=\"{inheritedType}\">\n");
            typeHandler.SerializeFields(obj, output, indentation + 1, recursionChecker);
            output.AppendJoin(XMLFormat.IndentChar, new string[indentation]);
            output.Append($"</{fieldName}>\n");

            recursionChecker.PopReference(obj);
            return(true);
        }
        public override bool Serialize(object obj, StringBuilder output, int indentation = 1, XMLRecursionChecker recursionChecker = null, string fieldName = null)
        {
            if (obj == null)
            {
                return(false);
            }

            fieldName ??= TypeName;
            output.AppendJoin(XMLFormat.IndentChar, new string[indentation]);
            output.Append($"<{fieldName}>\n");
            var iterable = (IEnumerable)obj;

            foreach (object item in iterable)
            {
                if (item == null)
                {
                    output.AppendJoin(XMLFormat.IndentChar, new string[indentation + 1]);
                    output.Append($"<{_elementTypeHandler.TypeName} xsi:nil=\"true\" />\n");
                    continue;
                }

                bool serialized = _elementTypeHandler.Serialize(item, output, indentation + 1, recursionChecker);

                // Force serialize in arrays, to preserve length.
                if (serialized)
                {
                    continue;
                }
                output.AppendJoin(XMLFormat.IndentChar, new string[indentation + 1]);
                output.Append($"<{_elementTypeHandler.TypeName}></{_elementTypeHandler.TypeName}>\n");
            }

            output.AppendJoin(XMLFormat.IndentChar, new string[indentation]);
            output.Append($"</{fieldName}>\n");
            return(true);
        }
Example #3
0
        protected void SerializeFields(object obj, StringBuilder output, int indentation, XMLRecursionChecker recursionChecker)
        {
            Dictionary <string, XMLFieldHandler> fieldHandlers = _fieldHandlers.Value;

            foreach ((string _, XMLFieldHandler field) in fieldHandlers)
            {
                if (field.Skip)
                {
                    continue;
                }

                object propertyVal  = field.ReflectionInfo.GetValue(obj);
                string fieldName    = field.Name;
                object defaultValue = field.DefaultValue;

                // Serialize null as self closing tag.
                if (propertyVal == null)
                {
                    if (defaultValue == null)
                    {
                        continue;
                    }
                    output.AppendJoin(XMLFormat.IndentChar, new string[indentation]);
                    output.Append($"<{fieldName}/>\n");
                    continue;
                }

                // If the property value is the same as the default value don't serialize it.
                if (propertyVal.Equals(defaultValue))
                {
                    continue;
                }

                bool serialized = field.TypeHandler.Serialize(propertyVal, output, indentation, recursionChecker, fieldName);

                // If not serialized that means the value passed is the default one of the type.
                // However we want to serialize it in this case, since it isn't the default of the field.
                // We do so by creating a field tag without contents, which will result in a default for the field-type value.
                if (serialized)
                {
                    continue;
                }
                output.AppendJoin(XMLFormat.IndentChar, new string[indentation]);
                output.Append($"<{fieldName}></{fieldName}>\n");
            }
        }
Example #4
0
        /// <inheritdoc />
        public override bool Serialize(object obj, StringBuilder output, int indentation = 1, XMLRecursionChecker recursionChecker = null, string fieldName = null)
        {
            if (obj == null)
            {
                return(false);
            }

            obj = SanitizeString((string)obj);
            return(base.Serialize(obj, output, indentation, recursionChecker, fieldName));
        }
Example #5
0
        public override bool Serialize(object obj, StringBuilder output, int indentation = 1, XMLRecursionChecker recursionChecker = null, string fieldName = null)
        {
            if (obj == null)
            {
                return(false);
            }

            fieldName ??= TypeName;
            output.AppendJoin(XMLFormat.IndentChar, new string[indentation]);
            output.Append($"<{fieldName}>\n");

            XMLFieldHandler keyHandler   = _keyHandler.Value;
            XMLFieldHandler valueHandler = _valueHandler.Value;

            keyHandler.TypeHandler.Serialize(keyHandler.ReflectionInfo.GetValue(obj), output, indentation + 1, recursionChecker, "Key");
            valueHandler.TypeHandler.Serialize(valueHandler.ReflectionInfo.GetValue(obj), output, indentation + 1, recursionChecker, "Value");

            output.AppendJoin(XMLFormat.IndentChar, new string[indentation]);
            output.Append($"</{fieldName}>\n");
            return(true);
        }
        public override bool Serialize(object obj, StringBuilder output, int indentation = 1, XMLRecursionChecker recursionChecker = null, string fieldName = null)
        {
            if (_defaultValue != null && obj.Equals(_defaultValue) || obj == null)
            {
                return(false);
            }

            fieldName ??= TypeName;
            output.AppendJoin(XMLFormat.IndentChar, new string[indentation]);
            output.Append($"<{fieldName}>\n");
            SerializeFields(obj, output, indentation + 1, recursionChecker);
            output.AppendJoin(XMLFormat.IndentChar, new string[indentation]);
            output.Append($"</{fieldName}>\n");

            return(true);
        }
Example #7
0
        /// <summary>
        /// Serialize the object.
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="output"></param>
        /// <param name="indentation"></param>
        /// <param name="recursionChecker"></param>
        /// <param name="fieldName"></param>
        /// <returns></returns>
        public virtual bool Serialize(object obj, StringBuilder output, int indentation = 1, XMLRecursionChecker recursionChecker = null, string fieldName = null)
        {
            if (obj == null)
            {
                return(false);
            }

            fieldName ??= TypeName;
            output.AppendJoin(XMLFormat.IndentChar, new string[indentation]);
            output.Append($"<{fieldName}>{Convert.ToString(obj, CultureInfo.InvariantCulture)}</{fieldName}>\n");
            return(true);
        }
Example #8
0
        public override bool Serialize(object obj, StringBuilder output, int indentation = 1, XMLRecursionChecker recursionChecker = null, string fieldName = null)
        {
            if (_defaultValue != null && obj.Equals(_defaultValue) || obj == null)
            {
                return(false);
            }

            fieldName ??= TypeName;
            output.AppendJoin(XMLFormat.IndentChar, new string[indentation]);
            output.Append($"<{fieldName}>\n");

            Dictionary <string, XMLFieldHandler> fieldHandlers = _fieldHandlers.Value;

            foreach ((string _, XMLFieldHandler field) in fieldHandlers)
            {
                if (field.Skip)
                {
                    continue;
                }

                object propertyVal = field.ReflectionInfo.GetValue(obj);
                field.TypeHandler.Serialize(propertyVal, output, indentation + 1, recursionChecker, field.Name);
            }

            output.AppendJoin(XMLFormat.IndentChar, new string[indentation]);
            output.Append($"</{fieldName}>\n");

            return(true);
        }
Example #9
0
 public override bool Serialize(object obj, StringBuilder output, int indentation = 1, XMLRecursionChecker recursionChecker = null, string fieldName = null)
 {
     if (_defaultValue != null && obj.Equals(_defaultValue))
     {
         return(false);
     }
     return(base.Serialize(obj, output, indentation, recursionChecker, fieldName));
 }
Example #10
0
        protected virtual void SerializeFields(object obj, StringBuilder output, int indentation, XMLRecursionChecker recursionChecker)
        {
            Dictionary <string, XMLFieldHandler> fieldHandlers = _fieldHandlers.Value;

            foreach ((string _, XMLFieldHandler field) in fieldHandlers)
            {
                object propertyVal = field.ReflectionInfo.GetValue(obj);
                string fieldName   = field.Name;
                field.TypeHandler.Serialize(propertyVal, output, indentation, recursionChecker, fieldName);
            }
        }