开发者

Small Simple Local Data Store for keeping user settings

开发者 https://www.devze.com 2023-01-29 12:11 出处:网络
I have this tiny C# winforms application that will NOT grow larger in any way. It\'s just two input fields and a button.

I have this tiny C# winforms application that will NOT grow larger in any way. It's just two input fields and a button.

I want to know if you guys have knowledge of a way to store the values that a user inputs in a local datastore. You may consider 10 records to be a lot of data for this scenario.

Requirements

  1. It shouldn't require any setup from the database side. (table creation, etc)

  2. I should be able to just give it an object and it should store it, I don't want to waste time on that.

  3. The data needs to be fairly easily retrievable.

  4. I want to be able to reuse this thing for every small app I create like this.

My Ideas

  1. A POCO object that will be XML-Serialized and saved to the Local Settings folder. Upon loading of the app, this file is deserialized back into the POCO object.

  2. An OODBMS: I have no experience with these but I always thought they consisted of a single dll so it would be easy to package them with the program.

  3. I once, a long long time ago, built an application that stored user settings inside the registry. Don't know if that is still apprecia开发者_JAVA技巧ted though.

What do you think is the best approach?

Code samples are very much appreciated!


I've taken both answers into account and built the following:

public static class IsolatedStorageExtensions
{
    public static void SaveObject(this IsolatedStorage isoStorage, object obj, string fileName)
    {
        IsolatedStorageFileStream writeStream = new IsolatedStorageFileStream(fileName, FileMode.Create);
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(writeStream, obj);
        writeStream.Flush();
        writeStream.Close();
    }

    public static T LoadObject<T>(this IsolatedStorage isoStorage, string fileName)
    {
        IsolatedStorageFileStream readStream = new IsolatedStorageFileStream(fileName, FileMode.Open);
        BinaryFormatter formatter = new BinaryFormatter();
        T readData = (T)formatter.Deserialize(readStream);
        readStream.Flush();
        readStream.Close();

        return readData;
    }
}

A wrapper POCO object that contains that data to be serialized:

[Serializable]
internal class DataStoreContainer
{
    public DataStoreContainer()
    {
        UserIDs = new List<int>();
    }

    public List<int> UserIDs { get; set; }
}

To consume these extensions:

private IsolatedStorageFile _isoStore = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);
private DataStoreContainer _data = new DataStoreContainer();
private const string FILENAME = "MyAppName.dat";

And in any method where you want to get the data :

_data = _isoStore.LoadObject<DataStoreContainer>(FILENAME);

To save the data:

_isoStore.SaveObject(_data, FILENAME);


Have you looked at Isolated Storage? It stores data in a local file, specific to that user (or to the application, depending on how you specify). You can easily serialize objects to and from the store because it's stream-based. It sounds like the perfect solution for your problem.


Since you state 10 items would be a lot I would vote for #1 or a variation of #1, Binary serialized... you don't seem to indicate that being able to read the data is important and binary data should give you smaller file sizes, though if 10 is a lot this still shouldn't be important.

That being said I enjoy what I've seen of db4objects.

0

精彩评论

暂无评论...
验证码 换一张
取 消