public JsonValue ToJson( object subject, Type typeScope, SerializationContext context ) { if (!(subject is Exception exception)) { throw new ArgumentException( "Provided instance is not an exception." ); } try { // every exception should be ISerializable return(SerializableTypeSerializer.ToJson( subject, typeScope, context )); } catch { // it doesn't want to be serialized, // so serialize at lest what can be pulled out manually // (we want to get at least some information to the client) return(new JsonObject() .Add("ClassName", exception.GetType().FullName) .Add("HResult", exception.HResult) .Add("Message", exception.Message) .Add("StackTraceString", exception.StackTrace)); } }
private static JsonValue Serialize( object subject, Type typeScope, SerializationContext context ) { Type type = subject.GetType(); // .NET primitives if (type.IsPrimitive) { return(DotNetPrimitivesSerializer.ToJson(subject, type)); } // string if (type == typeof(string)) { return((string)subject); } // enums if (type.IsEnum) { return(EnumSerializer.ToJson(subject)); } // arrays if (type.IsArray) { // binary data if (type == typeof(byte[])) { return(BinarySerializer.ToJson(subject, typeScope, context)); } return(ArraySerializer.ToJson(subject, typeScope, context)); } // by what type value to search through ITypeSerializers var searchType = type.IsGenericType ? type.GetGenericTypeDefinition() : type; // exact type serializers if (exactTypeSerializers.TryGetValue(searchType, out ITypeSerializer serializer)) { return(serializer.ToJson(subject, typeScope, context)); } // assignable type serializers foreach (var pair in assignableTypeSerializers) { if (pair.Key.IsAssignableFrom(searchType)) { return(pair.Value.ToJson(subject, typeScope, context)); } } // unisave serializable if (typeof(IUnisaveSerializable).IsAssignableFrom(type)) { return(UnisaveSerializableTypeSerializer.ToJson( subject, typeScope, context )); } // serializable if (typeof(ISerializable).IsAssignableFrom(type)) { return(SerializableTypeSerializer.ToJson( subject, typeScope, context )); } // validate type scope if (!typeScope.IsAssignableFrom(type)) { throw new ArgumentException( $"Given subject is of type {type} that is not assignable " + $"to the given type scope {typeScope}" ); } // other return(DefaultSerializer.ToJson(subject, typeScope, context)); }