如何保存C#app的状态以便以后加载

时间:2008-11-20 14:42:07

标签: c# .net

我有一个程序,用户将多个对象添加到场景中。这些对象都表示为类。 现在我希望用户能够保存场景,因此可以再次加载。

我是否可以使用某种基因保存方法,或者我必须编写自己的方法来保存所有属性等的值,然后创建新对象并在用户再次加载方案时将保存的值插入其中。

/ P

编辑:感谢快速回复的人。 我实际上是在SQL Compact 3.5数据库中存储对象的默认值。因此,如果有人知道如何序列化为SQL,那将是很好的信息。

编辑2:再次感谢!我将序列化为xml,然后将其作为字符串存储到SQL数据库中。

5 个答案:

答案 0 :(得分:5)

假设您的对象具有可用作公共属性的所有值,您可以使用XMLSerializer将对象转换为XML字符串,然后使用XMLDeserializer重新创建对象。

有一种扩展方法可以完成此here

如果您有私有变量,您仍然可以编写自己的自定义序列化/反序列化方法。

编辑以回复原始问题编辑:

您可以使用任何这些序列化技术将字符串存储到数据库中。另一种选择是使用ORM(对象关系映射器)来弥合对象和数据库之间的差距。

答案 1 :(得分:2)

通常人们会使用数据库来做这种事情。这可能是推荐的做法。

但是如果你想要一个快速而又脏的方法,你可以用相对较少的代码序列化为Xml或Binary。查看System.Runtime.Serialization的内容。 Xml或Binary的权衡是版本化时间很长。

考虑包含1.0应用程序中对象的xml文件集合。如果从1.0开始为这些对象添加了字段,那么它们将不兼容任何新的1.1对象。要解决此问题,您必须编写类型为1.0的手动更新序列 - > 1.1。更糟糕的是,如果您使用自动发现代码(自动序列化),例如它们的xml或二进制序列化程序,您甚至可能必须将对象命名为不同的名称Product1 / Product1.1 / etc,它可以是或者编写您自己的序列化代码。

如果你的应用程序开始接近任何严重程度,我会说你可能想要使用数据库。 SqlLite对于1个用户应用程序来说非常简单和简单,任何更大的东西都可以使用正确的RDBMS。

答案 2 :(得分:1)

您需要查看.NET序列化,这是一个很大的主题。 Here's an introductory tutorial.

答案 3 :(得分:1)

您还可以查看db4o,它是一个简单的对象数据库。

答案 4 :(得分:0)

.NET序列化是最简单的方法,尽管版本控制可能是一个问题,如前所述。这可能不是一个大问题,具体取决于您的对象有多复杂。序列化/反序列化逻辑需要足够智能,以处理缺少属性的情况,或者具有旧版本序列化对象中不存在的新属性的默认行为。主要是通过捕获SerializationExceptions并在那里处理它们来处理。

我认为你也会遇到数据库的这个问题 - 除了我猜它会用你用来将现有数据库迁移到最新版本的任何方法处理(即将新列添加到RDBMS表或属性中) ODBMS对象)。