我有一个程序可以从脚本文件中提取一些代码并编译它。它工作正常。
问题是:在脚本中我声明了几个类,我想序列化它们。显然,C# 序列化程序(xml 和二进制)不喜欢序列化和反序列化在内存程序集中定义的对象。
我更喜欢不要留下内存中的程序集,所以我正在寻找另一种序列化的方式,但是以防万一,是否可以在内存中构建程序集并最终将其写入文件?
我有一个程序可以从脚本文件中提取一些代码并编译它。它工作正常。
问题是:在脚本中我声明了几个类,我想序列化它们。显然,C# 序列化程序(xml 和二进制)不喜欢序列化和反序列化在内存程序集中定义的对象。
我更喜欢不要留下内存中的程序集,所以我正在寻找另一种序列化的方式,但是以防万一,是否可以在内存中构建程序集并最终将其写入文件?
You could always write your own ToXml function using reflection to write out your property data to a string. Then your object would deserialize itself.
Just a thought.
我会尽可能避免所有内置序列化,两者都严重损坏。例如,XML 序列化不支持字典,普通序列化/SOAP 不支持泛型。两者都有版本问题。
这很耗时,但创建 ToXML 和 FromXML 方法可能是最有效的方法。
如果您想动态创建程序集,请查看通过反射发射的 IL。 这是一篇很好的文章,可以帮助您入门。
所以只是为了澄清,你是在问如果没有应用 [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 序列化的示例
我对 XmlSerializer 不能序列化动态生成的类型的说法有点困惑。XmlSerializer 在构造过程中也会动态生成它自己的序列化代码,因此它序列化您的类型应该没有问题。
您可能需要使用适当的属性装饰您的动态类,具体取决于您生成的内容(如派生类),但在您描述的情况下使用 XmlSerializer 应该没有任何问题。
如果您可以发布有关 XmlSerializer 给您的问题的详细信息,我可以帮助您找出问题所在。
另外,我相信自动生成代码通常是一种祝福。我经常不得不回到一个类来修复一个或所有复制/粘贴/保存/加载功能,只是因为有人在添加新变量时忘记更新它们。保存/加载代码是样板代码。让电脑来写吧。