我有以下方法将对象保存到文件:
// Save an object out to the disk
public static void SerializeObject<T>(this T toSerialize, String filename)
{
XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
TextWriter textWriter = new StreamWriter(filename);
xmlSerializer.Serialize(textWriter, toSerialize);
textWriter.Close();
}
我承认我没有写它(我只将其转换为带有类型参数的扩展方法) .
现在我需要它将xml作为字符串返回给我(而不是将其保存到文件中) . 我正在研究它,但我还没想到它 .
我认为对于熟悉这些对象的人来说这可能很容易 . 如果不是,我最终会弄明白 .
10 回答
使用StringWriter而不是StreamWriter:
注意,在XmlSerializer构造函数中使用
toSerialize.GetType()
而不是typeof(T)
非常重要:如果使用第一个代码,则代码涵盖T
的所有可能子类(对方法有效),而使用后者则在传递派生类型时会失败来自T
. 下面是一些激活此语句的示例代码的链接,XmlSerializer
在使用typeof(T)
时抛出Exception
,因为您将派生类型的实例传递给调用在派生类型的基类中定义的SerializeObject的方法:http://ideone.com/1Z5J1 .此外,Ideone使用Mono执行代码;使用Microsoft .NET运行时的实际
Exception
与Ideone上显示的实际Message
不同,但它失败的方式相同 .我知道这不是问题的答案,但根据问题的投票数和接受的答案,我怀疑人们实际上是在使用代码将对象序列化为字符串 .
使用XML序列化会在输出中添加不必要的额外文本垃圾 .
对于以下课程
它会产生
更好的解决方案是使用JSON序列化(最好的之一是Json.NET) . 要序列化对象:
要反序列化对象:
序列化的JSON字符串如下所示:
序列化和反序列化:
代码安全说明
关于accepted answer,重要的是在
XmlSerializer
构造函数中使用toSerialize.GetType()
而不是typeof(T)
:如果使用第一个代码涵盖所有可能的场景,而使用后者则有时会失败 .下面是一个激活此语句的示例代码的链接,
XmlSerializer
在使用typeof(T)
时抛出异常,因为您将派生类型的实例传递给调用派生类型基类中定义的SerializeObject<T>()
的方法:http://ideone.com/1Z5J1 . 请注意,Ideone使用Mono来执行代码:使用Microsoft .NET运行时获得的实际异常消息与Ideone上显示的消息不同,但它失败的方式相同 .为了完整起见,我在这里发布完整的代码示例以供将来参考,以防Ideone(我发布代码的地方)将来变得不可用:
我的2p ......
我无法使用xhafan建议的JSONConvert方法
在.Net 4.5中,即使添加了“System.Web.Extensions”程序集引用,我仍然无法访问JSONConvert .
但是,一旦添加引用,您就可以使用以下命令打印出相同的字符串:
我觉得我需要将这个被操纵的代码分享到接受的答案 - 因为我没有声誉,我无法评论..
在极少数情况下,您可能希望实现自己的String序列化 .
但这可能是一个 bad 的想法,除非你知道你在做什么 . (例如,使用批处理文件序列化I / O)
这样的东西可以解决问题(手动/批量编辑很容易),但要注意应该做更多的检查,比如该名称不包含换行符 .
[VB]
[C#]