如果答案是“这是不可能的”,那就没关系。我不会沮丧。但我想知道,在使用C#制作游戏时,是否有任何方法可以模仿控制台模拟器的“保存状态”功能。据我所知,仿真器有点容易,它们只是转储虚拟化内存,指令指针等所有内容。因此,他们可以完全相同的方式恢复,在游戏代码中与之前完全相同的位置。我知道我无法从相同的代码行恢复,但有没有办法可以维持整个游戏状态而无需手动保存每个变量?我希望每次在游戏中添加内容时都不需要扩展或修改。
我猜测如果有任何可能的方法,它会使用p / invoke ......
答案 0 :(得分:12)
嗯,在C#中你原则上也可以这样做。它被称为serialization。同意,它与内存转储不完全相同,但足够接近。
要将类标记为可序列化,只需将Serializable
attribute添加到其中:
[Serializable]
class GameState
有关可能更改的课程的其他信息:
如果将新成员添加到可序列化类中,则可以使用
OptionalField
attribute标记它们,以允许反序列化先前版本的对象而不会出错。此属性仅影响反序列化,并防止运行时在序列化流中缺少成员时抛出异常。也可以使用NonSerialized
attribute标记成员,以表明不应序列化成员。这将使这些成员的详细信息保密。要修改默认反序列化(例如,要自动初始化标记为
NonSerialized
的成员),该类必须实现IDeserializationCallback
接口并定义IDeserializationCallback.OnDeserialization
method。对象可以二进制格式序列化,以便其他.NET应用程序进行反序列化。该框架还提供
SoapFormatter
和XmlSerializer
个对象,以支持人类可读的跨平台XML中的序列化。
答案 1 :(得分:3)
如果您将“状态”类的每一个都设置为Serializable,那么您可以将对象逐个序列化为文件。然后,当您需要恢复时,可以从该文件再次加载它们。
答案 2 :(得分:0)
我同意其他海报,让你的游戏状态类Serializable可能是你想要的方式。其他人已经涵盖了基本序列化;对于高端替代方案,您可以查看NHibernate,它将持久化对象到数据库。你可以在这些链接上找到关于NHibernate的一些好消息: http://www.codeproject.com/KB/database/Nhibernate_Made_Simple.aspx