2008-11-20 70 views
3

我有一个程序,用户在场景中添加多个对象。这些对象都被表示为一个类。 现在我希望用户能够保存场景,因此可以再次加载。如何保存一个C#应用程序的状态,以便以后可以加载

是否有一些我可以使用的genereic save方法,还是我必须编写自己的方法来保存所有属性的值,然后在用户再次加载场景时创建新对象并将保存的值插入到它们中。

/P

编辑:感谢您的快速回复家伙。 实际上,我现在将对象的默认值存储在SQL compact 3.5数据库中。所以如果有人知道如何序列化到SQL,那将是很好的信息。

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

回答

5

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

有一种扩展方法来完成这个here

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

编辑回应原来的问题编辑:

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

2

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

但是,如果你想要一个快速和肮脏的方法,你可以序列化到Xml或二进制相对较少的代码。看看System.Runtime.Serialization的东西。 Xml或Binary的折衷在于版本控制很糟糕。

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

如果您的应用程序开始接近任何严重程度,我会说你可能会想要使用数据库。 SqlLite对于1个用户应用程序非常好,并且非常简单,任何更大的应用程序都需要适当的RDBMS。

+0

如果应用程序尚未使用数据库,海报不会声明。如果没有,我不会推荐将其引入。将XML序列化为文件。就像MSWord一样。 – Anthony 2008-11-20 15:23:18

1

你也可以看看db4o,这是一个简单的对象数据库。

0

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

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

相关问题