如何保存C#应用程序的状态以便以后加载

如何保存C#应用程序的状态以便以后加载,c#,.net,C#,.net,我有一个程序,用户在其中向场景添加多个对象。这些对象都表示为类。 现在,我希望用户能够保存场景,以便再次加载 是否有某种genereic保存方法可以使用,或者我必须编写自己的方法来保存所有属性等的值,然后创建新对象,并在用户再次加载场景时将保存的值插入其中 /p 编辑:谢谢你们的快速回复。 实际上,我现在正在SQL compact 3.5数据库中存储对象的默认值。所以,如果有人知道如何序列化到SQL,这将是一个很好的信息 编辑2:再次感谢!我将序列化为xml,然后将其作为字符串存储到SQL数据库

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

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

/p

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


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

通常会使用数据库来完成这类工作。这可能是推荐的做法

然而,如果您想要一个快速而肮脏的方法,您可以用相对较少的代码将其序列化为Xml或二进制。查看System.Runtime.Serialization内容。Xml或二进制的折衷是版本控制耗费大量时间

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


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

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

有一种扩展方法可以实现这一点

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

编辑以响应原始问题编辑:


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

您需要了解.NET序列化,这是一个重要的主题

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

.NET序列化是实现这一点的最简单方法,尽管版本控制可能是一个问题,正如前面提到的那样。根据对象的复杂程度,这可能不是一个大问题。序列化/反序列化逻辑需要足够智能,以处理缺少属性的情况,或者具有由旧版本序列化的序列化对象中不存在的新属性的默认行为。这主要是通过捕获SerializationException并在那里处理它们来实现的


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

海报没有说明应用程序是否还没有使用数据库。如果没有,我不建议带一个进来。将文件序列化为XML。就像MSWord一样。是的。。但这张海报似乎在犯我多年前犯过的错误。因此,我只是警告他们在blob中存储对象的权衡。我也非常怀疑MSWord是否有xmlSerialiser.Serialize(wordDocument)。它可能会滚动它自己的自定义序列化。