在C#游戏中是否有任何方法可以“保存状态”?

3
如果回答是“不可能”,那也没关系,我不会生气。但是我想知道,在使用C#制作游戏时,是否有任何方法可以模仿控制台模拟器的“保存状态”功能。据我所知,模拟器相对容易实现,它们只需转储虚拟内存的全部内容、指令指针等即可。因此,它们可以恢复到与之前完全相同的位置和状态。我知道我无法从代码的同一行继续执行,但是否有任何方法可以在不手动保存每个变量的情况下保持游戏的整个状态?我希望找到一种方法,不需要每次添加新内容时都进行扩展或修改。
我猜如果有可能做到这一点,它将使用p/invoke...
3个回答

12

在C#中,原则上你可以做同样的事情,这被称为序列化。虽然不完全是内存转储,但足够接近。

要将类标记为可序列化,只需向其添加Serializable属性

[Serializable]
class GameState

关于可能更改的类的其他信息:

如果将新成员添加到可序列化的类中,可以使用OptionalField属性对其进行标记,以允许先前版本的对象在反序列化时不出错。此属性仅影响反序列化,并防止运行时在序列化流中缺少成员时抛出异常。成员还可以使用NonSerialized属性标记,表示它不应被序列化。这将允许保留那些成员的详细信息。

要修改默认反序列化(例如,自动初始化标记为NonSerialized的成员),该类必须实现IDeserializationCallback接口并定义IDeserializationCallback.OnDeserialization方法

对象可以以二进制格式序列化,以便由其他 .NET 应用程序进行反序列化。框架还提供了SoapFormatterXmlSerializer对象,以支持以人类可读的跨平台 XML 格式进行序列化。

维基百科:序列化,.NET Framework


所以基本上,将所有东西标记为可序列化,然后在我的最高级别游戏类上调用serialize?然后它将自动序列化它包含的所有对象,以此类推? - Tesserex
没错。所有这些如何协同工作的更细节的细节有点更复杂,但基本上就是这样。 - Joey

3
如果你将所有的“state”类都做成可序列化的,那么你就可以将对象直接序列化到文件中。当需要恢复时,你可以从这个文件中重新加载它们。
参见ISerializable

0

NHibernate对于这种事情来说有点大材小用了——将所有内容序列化到文件中真的很简单。 - slugster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接