【问题标题】:Serialize in memory object with C#用 C# 在内存对象中序列化
【发布时间】:2009-01-29 00:24:57
【问题描述】:

我有一个程序可以从脚本文件中提取一些代码并进行编译。 而且效果很好。

问题是:在脚本中我声明了几个类,我想序列化它们。 显然 C# 序列化器(xml 和二进制)不喜欢序列化和反序列化定义在内存程序集中的对象。

我更喜欢不要留下内存中的程序集,所以我正在寻找另一种序列化方式,但万一,可以在内存中构建程序集并最终将其写入文件?

【问题讨论】:

    标签: c# serialization assemblies in-memory


    【解决方案1】:

    您始终可以使用反射编写自己的 ToXml 函数,将属性数据写入字符串。然后你的对象会反序列化自己。

    只是一个想法。

    【讨论】:

      【解决方案2】:

      如果您想动态创建程序集,请查看通过反射发出的 IL。 Here is a good article to get you started.

      【讨论】:

        【解决方案3】:

        所以为了澄清一下,你是在问如果没有应用 [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 做了很好的介绍。

        【讨论】:

          【解决方案4】:

          我会尽可能避免所有内置序列化,两者都严重损坏。例如,XML 序列化不支持字典,普通序列化/SOAP 不支持泛型。两者都有版本问题。

          这很耗时,但创建 ToXML 和 FromXML 方法可能是最有效的方法。

          【讨论】:

            【解决方案5】:

            看看at here 的自定义序列化器,它是字典 XML 序列化的示例

            【讨论】:

              【解决方案6】:

              我对 XmlSerializer 不能序列化动态生成的类型的说法有点困惑。 XmlSerializer 在构造过程中也会动态生成它自己的序列化代码,因此它对您的类型进行序列化应该没有问题。

              您可能需要使用适当的属性装饰您的动态类,具体取决于您生成的内容(如派生类),但在您描述的情况下使用 XmlSerializer 应该没有任何问题。

              如果您可以发布有关 XmlSerializer 给您的问题的详细信息,我可以帮助您找出问题所在。

              另外,我相信自动生成代码通常是一件好事。我经常不得不回到一个类来修复一个或所有复制/粘贴/保存/加载功能,只是因为有人在添加新变量时忘记更新它们。保存/加载代码是样板代码。让电脑自己写吧。

              【讨论】:

                猜你喜欢
                • 2012-01-09
                • 2012-01-12
                • 2014-01-30
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2022-01-13
                • 2015-09-16
                • 1970-01-01
                相关资源
                最近更新 更多