设置:我正在使用从VS2010针对.NET 4.0的C#程序中托管的IronRuby 1.1.3。
目标:为了能够存储和恢复我的(相当小的)应用程序,我正在寻找一种方法来简单地存储和加载我的托管引擎的整个状态 - 这正是虚拟机的常见做法。
问题 1.首先,我尝试在Ruby中执行此操作,在一个“顶级”对象上使用Marshal.dump,该对象基本上引用了我的代码中的其他所有内容。倾销看似没有问题(我得到一个31k小文件)。
但是,在尝试加载文件时,我得到一个异常“Class Proc没有有效的构造函数”。检查Marshal课程,我发现我有比我更关心的限制。特别是 - MatchData,Data,Method,UnboundMethod,Proc,Thread,ThreadGroup,Continuation的实例 *定义单例方法的对象
不幸的是,我很享受Ruby的自由,并且非常广泛地使用Procs和singleton方法。对我来说,奇怪的是我在反序列化之前没有得到错误。
其次,我开始检查ScriptEngine和相关类是否可能支持存储状态等。似乎CompiledCode可能存储(虽然没有尝试)但是因为我没看到当前的引擎状态可以转换为代码,这也没有帮助我。
此外,我发现了这种方法,其中定义了SerializableProc(我可能会考虑重新编码所有的proc;但我不确定我是否设法以相同的方式处理单例方法) http://rubyquiz.com/quiz38.html
不过,我自然更喜欢“开箱即用”的解决方案。我也很好奇为什么Ruby不会简单地采用这样的方法开始并包装像这样的“unmarshalable”结构(除了重点,但我很好奇)。
顺便说一句,我也偶然发现了这一点,这对我没有帮助,但我处于那个位置,我实际上做想要存储“一切”。也许这会给某人一个想法...... http://yehudakatz.com/2011/11/19/how-to-marshal-procs-using-rubinius/
编辑:5。最简单的方法,简单地使用二进制序列化器(BinaryFormatter),也不起作用;我得到ScriptEngine未标记为可序列化的错误。不过,这种“蛮力”解决方案已经解决了我的问题。
问题:如何简单地存储我的运行时引擎?我实际上并不关心Ruby内部还是DLR。任何完成这项工作的解决方案都非常感谢!
(因为我在程序运行期间没有修改Procs或singleton方法,如果我可以简单地“合并”我的启动状态下的变化(变量值包括对其他对象的引用),我也会很高兴。代码。)
编辑:由于根本没有收到任何答案,我决定更新标题。我希望新的问题能更好地解决我的问题。