Beispiel #1
0
        private XAttribute[] GetFormattedValue(Type formatterType, object value)
        {
            var ctor      = formatterType.GetConstructor(Type.EmptyTypes);
            var formatter = (SerializationFormatter)ctor.Invoke(null);

            // var formatter = (SerializationFormatter)formatterType.Assembly.CreateInstance(formatterType.AssemblyQualifiedName);
            return(new[] { new XAttribute(XmlConstants.Value, XmlHelper.EscapeInvalidCharacters(formatter.ToString(value))), new XAttribute(XmlConstants.Formatter, GetTypeId(formatterType).ToString()), });
        }
Beispiel #2
0
        private XElement WriteValue(string elementName, SerializeAttribute serializeAttribute, object value, params object[] content)
        {
            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            XElement element;

            Type type  = value.GetType();
            int  refId = _visitedObjects.FindRefId(value);

            if (refId >= 0)
            {
                element = new XElement(elementName, content, new XAttribute(XmlConstants.Ref, refId.ToString(CultureInfo.InvariantCulture)));
                if (serializeAttribute != null && serializeAttribute.ConstructorArgumentIndex >= 0)
                {
                    element.Add(new XAttribute(XmlConstants.Arg, serializeAttribute.ConstructorArgumentIndex));
                }
                return(element);
            }

            element = CreateElement(elementName, value, serializeAttribute, content);
            if (serializeAttribute != null && serializeAttribute.Formatter != null)
            {
                element.Add(GetFormattedValue(serializeAttribute.Formatter, value));
            }
            else if (type.IsPrimitive)
            {
                element.Add(new XAttribute(XmlConstants.Value, Convert.ToString(value, CultureInfo.InvariantCulture)));
            }
            else if (type.IsEnum)
            {
                element.Add(new XAttribute(XmlConstants.Value, value.ToString()));
            }
            else if (value is string)
            {
                element.Add(new XAttribute(XmlConstants.Value, XmlHelper.EscapeInvalidCharacters((string)value)));
            }
            else if (typeof(IDictionary).IsAssignableFrom(type))
            {
                WriteDictionaryElements(element, (IDictionary)value);
            }
            else if (typeof(IList).IsAssignableFrom(type) || typeof(ICollection).IsAssignableFrom(type))
            {
                WriteListElements(element, (IEnumerable)value);
            }
            else if (type == typeof(DateTime))
            {
                element.Add(new XAttribute(XmlConstants.Value, Convert.ToString(value, CultureInfo.InvariantCulture)));
            }
            else if (type == typeof(Color))
            {
                element.Add(new XAttribute(XmlConstants.Value, ColorTranslator.ToHtml((Color)value)));
            }
            else if (type == typeof(PointF))
            {
                PointF p = (PointF)value;
                element.Add(new XAttribute(XmlConstants.Value, XmlHelper.EscapeInvalidCharacters(p.X + "|" + p.Y)));
            }
            else
            {
                var map = SerializationMap.FromType(value.GetType());
                WriteMembers(element, map.Members, value);
            }

            return(element);
        }