Пример #1
0
    public static string SerializeObject(object obj, JsonSerializerSettings settings = null)
    {
        settings = settings ?? new JsonSerializerSettings();
        var sb = new StringBuilder();

        using (var writer = new StringWriter(sb))
            using (var jsonWriter = new JsonTextWriter(writer))
            {
                var oldError       = settings.Error;
                var oldTraceWriter = settings.TraceWriter;
                var oldFormatting  = settings.Formatting;
                try
                {
                    settings.Formatting = Newtonsoft.Json.Formatting.Indented;
                    if (settings.TraceWriter == null)
                    {
                        settings.TraceWriter = new MemoryTraceWriter();
                    }
                    settings.Error = oldError + delegate(object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
                    {
                        jsonWriter.Flush();
                        var logSb = new StringBuilder();
                        logSb.AppendLine("Serialization error: ");
                        logSb.Append("Path: ").Append(args.ErrorContext.Path).AppendLine();
                        logSb.Append("Member: ").Append(args.ErrorContext.Member).AppendLine();
                        logSb.Append("OriginalObject: ").Append(args.ErrorContext.OriginalObject).AppendLine();
                        logSb.AppendLine("Error: ").Append(args.ErrorContext.Error).AppendLine();
                        logSb.AppendLine("Partial serialization results: ").Append(sb).AppendLine();
                        logSb.AppendLine("TraceWriter contents: ").Append(settings.TraceWriter).AppendLine();
                        logSb.AppendLine("JavaScriptSerializer serialization: ");
                        try
                        {
                            logSb.AppendLine(new JavaScriptSerializer().Serialize(obj));
                        }
                        catch (Exception ex)
                        {
                            logSb.AppendLine("Failed, error: ").AppendLine(ex.ToString());
                        }
                        logSb.AppendLine("XmlSerializer serialization: ");
                        try
                        {
                            logSb.AppendLine(obj.GetXml());
                        }
                        catch (Exception ex)
                        {
                            logSb.AppendLine("Failed, error: ").AppendLine(ex.ToString());
                        }
                        logSb.AppendLine("BinaryFormatter serialization: ");
                        try
                        {
                            logSb.AppendLine(BinaryFormatterExtensions.ToBase64String(obj));
                        }
                        catch (Exception ex)
                        {
                            logSb.AppendLine("Failed, error: ").AppendLine(ex.ToString());
                        }
                        Debug.WriteLine(logSb);
                    };
                    var serializer = JsonSerializer.CreateDefault(settings);
                    serializer.Serialize(jsonWriter, obj);
                }
                finally
                {
                    settings.Error       = oldError;
                    settings.TraceWriter = oldTraceWriter;
                    settings.Formatting  = oldFormatting;
                }
            }
        return(sb.ToString());
    }
 public void TestRoundtrip()
 {
     BinaryFormatterExtensions.Roundtrip(new RemotePublishDisabledException())
     .Should().BeOfType <RemotePublishDisabledException>();
 }