C#在用户会话之间保留对象而不使用数据库

时间:2011-01-31 17:09:59

标签: c# object-persistence

我正在创建一个简单的Winforms,它读取文本文件并进行一些解析,将其放入C#对象,然后由我的应用程序操作。

我想解析一次文件。然后离开一个星期,回来并将所有对象加载回我的应用程序。

我不想坚持使用数据库,因此希望有一些我可以使用的简单对象持久性框架。

7 个答案:

答案 0 :(得分:3)

您在谈论serialization

请查看DataContractSerializer。如果您想要一个非XML文件,可以尝试DataContractJsonSerializer

您只需添加DataContractDataMember属性即可告诉序列化程序如何管理序列化。

如果您的对象不会更改(新/旧/重命名的属性和可见性)并且您不想阅读序列化格式,则可以尝试BinaryFormatter


框架中有几个较旧的序列化器(XmlSerializerBinaryFormatter等等),但对序列化格式的最佳控制将与上述相同。

答案 1 :(得分:2)

您可以使用应用程序设置或用户设置。使用可在项目属性下找到的向导非常简单。 here is the tutorial for it.

答案 2 :(得分:1)

您可以将它们序列化为XML文件。简单,快速,简单(除非有人破解文件)。

答案 3 :(得分:1)

执行此操作的最简单方法可能是使用BinaryFormatter类将对象直接序列化到文件中。您需要确保所有类型都标记为[Serializable],但这种方法快速而简单。

以下是任意对象图的“读取”和“写入”方法的简单示例:

private void SerializeToFile(string fileName, object o)
{
    var binaryFormatter = new BinaryFormatter();
    using (var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
    {
        binaryFormatter.Serialize(fileStream, o);
    }
}

private object DeserializeFromFile(string fileName)
{
    var binaryFormatter = new BinaryFormatter();
    using (var fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None))
    {
        return binaryFormatter.Deserialize(fileStream);
    }
}

其他方法包括XmlSerialization(XmlSerializer类) - 如果您希望序列化对象是人类可读或可编辑的,或者使用较新的DataContractSerializer,则更好。

答案 4 :(得分:1)

存储对象状态的最简单的非DB方法是序列化。将您的类标记为Serializable或DataContract,然后使用BinaryFormatter(如果使用DataContract,则使用DataContractSerializer)将对象转换为可持久状态。然后可以将其保存到一个文件,您可以在应用程序启动时加载并以类似方式反序列化。请注意,类的成员(包括子类)必须以相同的方式进行序列化,并且您将丢失对非序列化元素(如指针和委托引用)的任何引用。

答案 5 :(得分:1)

您可以按照之前的建议使用序列化。

保存数据的好地方是Windows Local Data文件夹 -

Environment.SpecialFolder.LocalApplicationData

答案 6 :(得分:0)

数据库有什么问题?如果您不想拥有完整引擎及其设置和相关问题,也许您可​​以查看基于“文件”的数据库......

我的第一个难点是:

  • SqlCompact
  • 访问数据库
  • SqlLite

...

根据您要保留的对象的复杂程度,这可能是一个很好的解决方案。