在C#游戏中以任何方式“保存状态”?

时间:2010-02-17 12:33:34

标签: c# save state

如果答案是“这是不可能的”,那就没关系。我不会沮丧。但我想知道,在使用C#制作游戏时,是否有任何方法可以模仿控制台模拟器的“保存状态”功能。据我所知,仿真器有点容易,它们只是转储虚拟化内存,指令指针等所有内容。因此,他们可以完全相同的方式恢复,在游戏代码中与之前完全相同的位置。我知道我无法从相同的代码行恢复,但有没有办法可以维持整个游戏状态而无需手动保存每个变量?我希望每次在游戏中添加内容时都不需要扩展或修改。

我猜测如果有任何可能的方法,它会使用p / invoke ......

3 个答案:

答案 0 :(得分:12)

嗯,在C#中你原则上也可以这样做。它被称为serialization。同意,它与内存转储不完全相同,但足够接近。

要将类标记为可序列化,只需将Serializable attribute添加到其中:

[Serializable]
class GameState

有关可能更改的课程的其他信息:

  

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

     

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

     

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

     

- Wikipedia: Serialization, .NET Framework

答案 1 :(得分:3)

如果您将“状态”类的每一个都设置为Serializable,那么您可以将对象逐个序列化为文件。然后,当您需要恢复时,可以从该文件再次加载它们。

请参阅ISerializable

答案 2 :(得分:0)

我同意其他海报,让你的游戏状态类Serializable可能是你想要的方式。其他人已经涵盖了基本序列化;对于高端替代方案,您可以查看NHibernate,它将持久化对象到数据库。你可以在这些链接上找到关于NHibernate的一些好消息: http://www.codeproject.com/KB/database/Nhibernate_Made_Simple.aspx

http://nhibernate.info/doc/burrow/faq