public string Serialize(object objectToSerialize)
        {
            if (objectToSerialize == null)
            {
                throw new ArgumentNullException("objectToSerialize");
            }

            StringBuilder sb = new StringBuilder();

            StringConversionServices.SerializeKeyValuePair(sb, "_Type_", TypeManager.SerializeType(objectToSerialize.GetType()));

            IEnumerable <PropertyInfo> propertyInfos =
                from prop in objectToSerialize.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)
                where prop.CanRead && prop.CanWrite
                select prop;

            foreach (PropertyInfo propertyInfo in propertyInfos)
            {
                MethodInfo methodInfo =
                    (from mi in typeof(StringConversionServices).GetMethods(BindingFlags.Public | BindingFlags.Static)
                     where mi.Name == "SerializeKeyValuePair" &&
                     mi.IsGenericMethodDefinition &&
                     mi.GetParameters().Length == 3 &&
                     mi.GetParameters()[2].ParameterType.IsGenericParameter
                     select mi).SingleOrDefault();

                methodInfo = methodInfo.MakeGenericMethod(new Type[] { propertyInfo.PropertyType });

                object propertyValue = propertyInfo.GetValue(objectToSerialize, null);

                methodInfo.Invoke(null, new object[] { sb, propertyInfo.Name, propertyValue });
            }

            return(sb.ToString());
        }
Exemplo n.º 2
0
        public bool TrySerialize(object objectToSerialize, out string serializedObject, out string errorMessage)
        {
            if (objectToSerialize == null)
            {
                throw new ArgumentNullException("objectToSerialize");
            }

            serializedObject = null;

            IEnumerable <SerializerHandlerAttribute> serializerHandlerAttributes = objectToSerialize.GetType().GetCustomAttributesRecursively <SerializerHandlerAttribute>();

            if (serializerHandlerAttributes.Count() == 0)
            {
                errorMessage = string.Format("The type '{0}' has no '{1}' defined in its inherit tree", objectToSerialize.GetType(), typeof(SerializerHandlerAttribute));
                return(false);
            }

            SerializerHandlerAttribute serializerHandlerAttribute = serializerHandlerAttributes.First();

            if (serializerHandlerAttribute.SerializerHandlerType == null)
            {
                errorMessage = string.Format("The type '{0}' has specified a null argument to the '{1}'", objectToSerialize.GetType(), typeof(SerializerHandlerAttribute));
                return(false);
            }

            if (typeof(ISerializerHandler).IsAssignableFrom(serializerHandlerAttribute.SerializerHandlerType) == false)
            {
                errorMessage = string.Format("The type '{0}' has specified a type that does not implement the '{1}' argument to the '{2}'", objectToSerialize.GetType(), typeof(ISerializerHandler), typeof(SerializerHandlerAttribute));
                return(false);
            }

            Type serializeHandlerType = serializerHandlerAttribute.SerializerHandlerType;

            ISerializerHandler serializerHandler;

            lock (_lock)
            {
                if (_serializeHandlers.TryGetValue(serializeHandlerType, out serializerHandler) == false)
                {
                    serializerHandler = (ISerializerHandler)Activator.CreateInstance(serializeHandlerType);

                    _serializeHandlers.Add(serializeHandlerType, serializerHandler);
                }
            }

            string serializedObj = serializerHandler.Serialize(objectToSerialize);

            StringBuilder sb = new StringBuilder();

            StringConversionServices.SerializeKeyValuePair(sb, "SerializerHandlerType", TypeManager.SerializeType(serializerHandler.GetType()));
            StringConversionServices.SerializeKeyValuePair(sb, "SerializedObject", serializedObj);

            errorMessage     = null;
            serializedObject = sb.ToString();
            return(true);
        }