【发布时间】:2009-01-29 00:24:57
【问题描述】:
我有一个程序可以从脚本文件中提取一些代码并进行编译。 而且效果很好。
问题是:在脚本中我声明了几个类,我想序列化它们。 显然 C# 序列化器(xml 和二进制)不喜欢序列化和反序列化定义在内存程序集中的对象。
我更喜欢不要留下内存中的程序集,所以我正在寻找另一种序列化方式,但万一,可以在内存中构建程序集并最终将其写入文件?
【问题讨论】:
标签: c# serialization assemblies in-memory
我有一个程序可以从脚本文件中提取一些代码并进行编译。 而且效果很好。
问题是:在脚本中我声明了几个类,我想序列化它们。 显然 C# 序列化器(xml 和二进制)不喜欢序列化和反序列化定义在内存程序集中的对象。
我更喜欢不要留下内存中的程序集,所以我正在寻找另一种序列化方式,但万一,可以在内存中构建程序集并最终将其写入文件?
【问题讨论】:
标签: c# serialization assemblies in-memory
您始终可以使用反射编写自己的 ToXml 函数,将属性数据写入字符串。然后你的对象会反序列化自己。
只是一个想法。
【讨论】:
如果您想动态创建程序集,请查看通过反射发出的 IL。 Here is a good article to get you started.
【讨论】:
所以为了澄清一下,你是在问如果没有应用 [Serializable] 属性,你如何序列化一个类型?
一种解决方案是使用 WCF 数据协定序列化程序:http://msdn.microsoft.com/en-us/library/ms731923.aspx。
显然,这只有在您可以针对 .Net 3.0 或更高版本时才有效。
您也可以实现 ISerializationSurrogate。 Jeffrey Richter 在http://msdn.microsoft.com/en-us/magazine/cc188950.aspx 做了很好的介绍。
【讨论】:
我会尽可能避免所有内置序列化,两者都严重损坏。例如,XML 序列化不支持字典,普通序列化/SOAP 不支持泛型。两者都有版本问题。
这很耗时,但创建 ToXML 和 FromXML 方法可能是最有效的方法。
【讨论】:
看看at here 的自定义序列化器,它是字典 XML 序列化的示例
【讨论】:
我对 XmlSerializer 不能序列化动态生成的类型的说法有点困惑。 XmlSerializer 在构造过程中也会动态生成它自己的序列化代码,因此它对您的类型进行序列化应该没有问题。
您可能需要使用适当的属性装饰您的动态类,具体取决于您生成的内容(如派生类),但在您描述的情况下使用 XmlSerializer 应该没有任何问题。
如果您可以发布有关 XmlSerializer 给您的问题的详细信息,我可以帮助您找出问题所在。
另外,我相信自动生成代码通常是一件好事。我经常不得不回到一个类来修复一个或所有复制/粘贴/保存/加载功能,只是因为有人在添加新变量时忘记更新它们。保存/加载代码是样板代码。让电脑自己写吧。
【讨论】: