Question

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 appreciated though.

What do you think is the best approach?

Code samples are very much appreciated!

Was it helpful?

Solution

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);

OTHER TIPS

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top