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); }
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"); } }
/// <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)); }
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); }
/// <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); }
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); }
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)); }
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); } }