/// <summary>
 /// The validation check on whether a type is serializable
 /// </summary>
 /// <param name="type">The type to test</param>
 /// <returns>Returns whether that type can be serialized</returns>
 public static bool TypeIsSerializable(Type type)
 {
     if (type == null)
     {
         throw new ArgumentNullException("type");
     }
     if (!type.IsSerializable)
     {
         return(false);
     }
     if (!type.IsGenericType)
     {
         return(true);
     }
     Type[] genericArguments = type.GetGenericArguments();
     for (int i = 0; i < genericArguments.Length; i++)
     {
         Type type2 = genericArguments[i];
         if (!SerializationTypeConverter.TypeIsSerializable(type2))
         {
             return(false);
         }
     }
     return(true);
 }
        private bool CanConvert(object sourceValue, Type destinationType, out byte[] serializationData, out Exception error)
        {
            serializationData = null;
            error             = null;
            if (destinationType == null)
            {
                error = new ArgumentNullException("destinationType");
                return(false);
            }
            if (sourceValue == null)
            {
                error = new ArgumentNullException("sourceValue");
                return(false);
            }
            PSObject pSObject = sourceValue as PSObject;

            if (pSObject == null)
            {
                error = new NotSupportedException(string.Format("Unsupported Source Type: {0}", sourceValue.GetType().FullName));
                return(false);
            }
            if (!SerializationTypeConverter.CanSerialize(destinationType))
            {
                error = new NotSupportedException(string.Format("Unsupported Type Conversion: {0}", destinationType.FullName));
                return(false);
            }
            if (typeof(Exception).IsAssignableFrom(destinationType) && pSObject.TypeNames != null && pSObject.TypeNames.Count > 0 && pSObject.TypeNames[0].StartsWith("Deserialized.System.Management.Automation"))
            {
                foreach (string current in pSObject.TypeNames)
                {
                    if (current.Equals("Deserialized.System.Management.Automation.ParameterBindingException", StringComparison.OrdinalIgnoreCase))
                    {
                        return(false);
                    }
                }
            }
            if (pSObject.Properties["SerializationData"] == null)
            {
                error = new NotSupportedException("Serialization Data is Absent");
                return(false);
            }
            object value = pSObject.Properties["SerializationData"].Value;

            if (!(value is byte[]))
            {
                error = new NotSupportedException("Unsupported Data Format");
                return(false);
            }
            serializationData = (value as byte[]);
            return(true);
        }
 /// <summary>
 /// Whether a type can be serialized
 /// </summary>
 /// <param name="type">The type to test</param>
 /// <returns>Whether the specified type can be serialized</returns>
 public static bool CanSerialize(Type type)
 {
     return(SerializationTypeConverter.TypeIsSerializable(type) && !type.IsEnum || (type.Equals(typeof(Exception)) || type.IsSubclassOf(typeof(Exception))));
 }
 /// <summary>
 /// Whether an object can be serialized
 /// </summary>
 /// <param name="obj">The object to test</param>
 /// <returns>Whether the object can be serialized</returns>
 public static bool CanSerialize(object obj)
 {
     return(obj != null && SerializationTypeConverter.CanSerialize(obj.GetType()));
 }