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