Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将任何对象序列化为字符串?_C#_.net_Serialization_Json.net - Fatal编程技术网

C# 如何将任何对象序列化为字符串?

C# 如何将任何对象序列化为字符串?,c#,.net,serialization,json.net,C#,.net,Serialization,Json.net,我遇到了一个问题,我的JSON序列化程序由于字符而随机失败。没有简单的方法来序列化任何和所有可能的c#对象 相反,您有几种解决问题的方法: 启用Json.NET跟踪。看见这将告诉您问题发生在对象图的何处 与使用JsonConvert.SerializeObject()序列化不同,如果使用包装字符串编写器StringWriter进行序列化并写入字符串,则可以刷新编写器并记录部分序列化。这可能会让我们知道问题出在哪里 您可以尝试使用各种其他序列化程序序列化,如果有任何工作,请记录结果 如果对象属性之

我遇到了一个问题,我的JSON序列化程序由于字符
而随机失败。没有简单的方法来序列化任何和所有可能的c#对象

相反,您有几种解决问题的方法:

  • 启用Json.NET跟踪。看见这将告诉您问题发生在对象图的何处

  • 与使用
    JsonConvert.SerializeObject()
    序列化不同,如果使用包装字符串编写器
    StringWriter
    进行序列化并写入字符串,则可以刷新编写器并记录部分序列化。这可能会让我们知道问题出在哪里

  • 您可以尝试使用各种其他序列化程序序列化,如果有任何工作,请记录结果

  • 如果对象属性之一引发异常,则可以尝试强制字段序列化。看

  • 例如,将#1、#2和#3放在一起可以得到以下方法:

    public static class JsonSerializerExtensions
    {
        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 static class XmlSerializerExtensions
    {
        public static T LoadFromXML<T>(this string xmlString)
        {
            using (StringReader reader = new StringReader(xmlString))
            {
                return (T)new XmlSerializer(typeof(T)).Deserialize(reader);
            }
        }
    
        public static string GetXml<T>(this T obj)
        {
            using (var textWriter = new StringWriter())
            {
                var settings = new XmlWriterSettings() { Indent = true, IndentChars = "  " };
                using (var xmlWriter = XmlWriter.Create(textWriter, settings))
                    new XmlSerializer(obj.GetType()).Serialize(xmlWriter, obj);
                return textWriter.ToString();
            }
        }
    }
    
    public static class BinaryFormatterExtensions
    {
        public static string ToBase64String<T>(T obj)
        {
            using (var stream = new MemoryStream())
            {
                new BinaryFormatter().Serialize(stream, obj);
                return Convert.ToBase64String(stream.GetBuffer(), 0, checked((int)stream.Length)); // Throw an exception on overflow.
            }
        }
    
        public static T FromBase64String<T>(string data)
        {
            return FromBase64String<T>(data, null);
        }
    
        public static T FromBase64String<T>(string data, BinaryFormatter formatter)
        {
            using (var stream = new MemoryStream(Convert.FromBase64String(data)))
            {
                formatter = (formatter ?? new BinaryFormatter());
                var obj = formatter.Deserialize(stream);
                if (obj is T)
                    return (T)obj;
                return default(T);
            }
        }
    }
    
    public静态类jsonserializer
    {
    公共静态字符串序列化对象(对象obj,JsonSerializerSettings=null)
    {
    设置=设置??新建JsonSerializerSettings();
    var sb=新的StringBuilder();
    使用(var编写器=新的StringWriter(sb))
    使用(var jsonWriter=newjsontextwriter(writer))
    {
    var oldError=设置。错误;
    var oldTraceWriter=settings.TraceWriter;
    var oldFormatting=settings.Formatting;
    尝试
    {
    settings.Formatting=Newtonsoft.Json.Formatting.Indented;
    if(settings.TraceWriter==null)
    settings.TraceWriter=新建MemoryTraceWriter();
    settings.Error=oldError+委托(对象发送方,Newtonsoft.Json.Serialization.ErrorEventArgs args args)
    {
    jsonWriter.Flush();
    var logSb=新的StringBuilder();
    logSb.AppendLine(“序列化错误:”);
    logSb.Append(“路径:”).Append(args.ErrorContext.Path.AppendLine();
    logSb.Append(“成员:”).Append(args.ErrorContext.Member.AppendLine();
    logSb.Append(“OriginalObject:”).Append(args.ErrorContext.OriginalObject.AppendLine();
    logSb.AppendLine(“错误:”).Append(args.ErrorContext.Error).AppendLine();
    logSb.AppendLine(“部分序列化结果:”).Append(sb.AppendLine();
    logSb.AppendLine(“TraceWriter内容:”).Append(settings.TraceWriter.AppendLine();
    logSb.AppendLine(“JavaScriptSerializer序列化:”);
    尝试
    {
    logSb.AppendLine(新的JavaScriptSerializer().Serialize(obj));
    }
    捕获(例外情况除外)
    {
    logSb.AppendLine(“失败,错误:”).AppendLine(例如ToString());
    }
    logSb.AppendLine(“XmlSerializer序列化:”);
    尝试
    {
    logSb.AppendLine(obj.GetXml());
    }
    捕获(例外情况除外)
    {
    logSb.AppendLine(“失败,错误:”).AppendLine(例如ToString());
    }
    logSb.AppendLine(“二进制格式化程序序列化:”);
    尝试
    {
    logSb.AppendLine(BinaryFormatterExtensions.ToBase64String(obj));
    }
    捕获(例外情况除外)
    {
    logSb.AppendLine(“失败,错误:”).AppendLine(例如ToString());
    }
    调试写入线(logSb);
    };
    var serializer=JsonSerializer.CreateDefault(设置);
    serializer.Serialize(jsonWriter,obj);
    }
    最后
    {
    设置。错误=旧错误;
    settings.TraceWriter=旧TraceWriter;
    settings.Formatting=oldFormatting;
    }
    }
    使某人返回字符串();
    }
    }
    公共静态类XmlSerialized
    {
    公共静态T LoadFromXML(此字符串xmlString)
    {
    使用(StringReader=新的StringReader(xmlString))
    {
    返回(T)新的XmlSerializer(typeof(T))。反序列化(reader);
    }
    }
    公共静态字符串GetXml(此T obj)
    {
    使用(var textWriter=new StringWriter())
    {
    var settings=new XmlWriterSettings(){Indent=true,IndentChars=“”};
    使用(var xmlWriter=xmlWriter.Create(textWriter,设置))
    新的XmlSerializer(obj.GetType()).Serialize(xmlWriter,obj);
    返回textWriter.ToString();
    }
    }
    }
    公共静态类BinaryFormatterExtensions
    {
    公共静态字符串ToBase64String(T obj)
    {
    使用(var stream=new MemoryStream())
    {
    新的BinaryFormatter().Serialize(流,obj);
    返回Convert.ToBase64String(stream.GetBuffer(),0,checked((int)stream.Length));//溢出时引发异常。
    }
    }
    公共静态T FromBase64String(字符串数据)
    {
    从Base64String返回(数据,null);
    }
    公共静态T FromBase64String(字符串数据,二进制格式化程序格式化程序)
    {
    使用(var stream=newmemoryStream(Convert.FromBase64String(数据)))
    {
    格式化程序=(格式化程序??新的二进制格式化程序());
    var obj=格式化程序。反序列化(流);
    if(obj是T)
    返回(T)obj;
    返回默认值(T);
    }
    }
    }
    
    您可能会使用适当的日志记录方法替换最终的
    Debug.WriteLine()
    ,然后将
    JsonConvert.SerializeObject(data)
    替换为
    
    
    public static class JsonSerializerExtensions
    {
        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 static class XmlSerializerExtensions
    {
        public static T LoadFromXML<T>(this string xmlString)
        {
            using (StringReader reader = new StringReader(xmlString))
            {
                return (T)new XmlSerializer(typeof(T)).Deserialize(reader);
            }
        }
    
        public static string GetXml<T>(this T obj)
        {
            using (var textWriter = new StringWriter())
            {
                var settings = new XmlWriterSettings() { Indent = true, IndentChars = "  " };
                using (var xmlWriter = XmlWriter.Create(textWriter, settings))
                    new XmlSerializer(obj.GetType()).Serialize(xmlWriter, obj);
                return textWriter.ToString();
            }
        }
    }
    
    public static class BinaryFormatterExtensions
    {
        public static string ToBase64String<T>(T obj)
        {
            using (var stream = new MemoryStream())
            {
                new BinaryFormatter().Serialize(stream, obj);
                return Convert.ToBase64String(stream.GetBuffer(), 0, checked((int)stream.Length)); // Throw an exception on overflow.
            }
        }
    
        public static T FromBase64String<T>(string data)
        {
            return FromBase64String<T>(data, null);
        }
    
        public static T FromBase64String<T>(string data, BinaryFormatter formatter)
        {
            using (var stream = new MemoryStream(Convert.FromBase64String(data)))
            {
                formatter = (formatter ?? new BinaryFormatter());
                var obj = formatter.Deserialize(stream);
                if (obj is T)
                    return (T)obj;
                return default(T);
            }
        }
    }