2009-05-16 6 views
1

最初SQLからLINQ to SQLを使用してからEntity Frameworkに移動しましたが、SQLCEが柔軟性に欠けているようです。 (今は、PrimaryKeyAによって参照されているため、PrimaryKeyAを削除できないと言われているので、テーブルを削除することはできません...後で変更できるということに自信がありません)軽量の柔軟なデータ永続性オプション

私は、アプリが多くの反復でリリースされ、データがかなり簡単に変更できる必要があるという点で柔軟性が必要です。新しいバージョンのアプリケーションでは、直接または変換を介して古いバージョンのデータを読み取ることができる必要があります。

デベロッパーには10MB未満である必要がありますが、5歳未満の方が軽量である必要があります。ユーザーはアプリ外のデータを変更する必要はありません。保存される。

高性能は問題ではなく、単なるユーザーのデータになるでしょう。今はXMLにLINQを活用するためにXMLを使用すると言ってしまいます。しかし、私は他の提案があるかどうか疑問に思っています。私は、通常のオブジェクトとの間で簡単に変換できるものが欲しいですが、XMLシリアル化はこれに対して機能しますか?

私が探しているのは、オブジェクトを変更して新しいバージョンに簡単に更新できるオブジェクトを永続化する簡単な方法です。パフォーマンスは大きな問題ではありませんが、少量/中規模のデータには少なくとも耐えられるはずです。 (基本的に、単一のユーザーのレシピのための電子書籍の調理帳)

答えて

1

あなたが検討しているXMLルートは合理的な考えかもしれないことをお勧めします。バイナリのシリアル化よりも冗長ではあるが、必要に応じてデバッグが容易になる。ディスクの使用量が少なくて済むように(オンザフライで)きれいに圧縮します。

2

ファイルには常にバイナリのシリアル化があります。セクシーではありませんが、機能し、サードパーティのツールやソフトウェアは必要ありません。 の前に必ずのデータグループとバージョン番号(通常はスキーマ番号と呼ばれます)を付けてください。これは、データモデルを変更したときの頭痛を緩和します。

OOPの設定では、通常、永続化が必要なすべてのオブジェクトに、方向パラメータ(保存と読み込み)とバイナリファイルを表すオブジェクトを受け取るSerialize()メソッドがあります。書き出すときは、すべてのオブジェクトがシリアル化されるようにする必要があります。あなたが読んでいるときに行くようにオブジェクトを作成する必要があります。オブジェクトを直列化する方法を知っているコンテナによって、このプロセスはしばしば簡単になります。

変換は、さまざまなSerialize()メソッドによってオンザフライで処理されます。たとえば、現在スキーマバージョン5にあるオブジェクトが、スキーマバージョン4を使用して記述されたデータに遭遇すると、それを処理する方法がわかります。

しかし、SQLのようなクエリ機能が必要な場合は、これが最善の選択肢ではないかもしれません。これは、すべてのデータを読み込むときに最適です。

例:

はあなたがシリアライズしたい2つのメンバ変数を持つクラスFooのを言う:

class Foo 
{ 
public: 
    const unsigned int SCHEMA = 1; 
    int i; 
    double d; 

    void Serialize(bool bSaving, CBinaryFile file) 
    { 
    if (bSaving) 
    { 
     // Serialize everything out 
     file << SCHEMA << i << d; 
    } 
    else 
    { 
     // Read in the schema number first 
     unsigned int nSchema; 
     file >> nSchema; 

     // Validate the schema number 
     if (nSchema > SCHEMA) 
     { 
     // We're reading in data that was written with a newer version of the program 
     // Since we don't know how to handle that let's error out 
     throw exception; 
     } 

     // Read everything in 
     file >> i >> d; 
    } 
    } 
} 

さて、あなたはFooのに他のメンバーを追加する年にしましょう。

class Foo 
{ 
public: 
    const unsigned int SCHEMA = 2; 
    int i; 
    double d; 
    string s; 

    void Serialize(bool bSaving, CBinaryFile file) 
    { 
    if (bSaving) 
    { 
     // Serialize everything out 
     file << SCHEMA << i << d << s; 
    } 
    else 
    { 
     // Read in the schema number first 
     unsigned int nSchema; 
     file >> nSchema; 

     // Validate the schema number 
     if (nSchema > SCHEMA) 
     { 
     // We're reading in data that was written with a newer version of the program 
     // Since we don't know how to handle that let's error out 
     throw exception; 
     } 

     // Read everything in 
     file >> i >> d; 
     if (nSchema > 1) 
     file >> s; 
    } 
    } 
} 

フライ変換でスキーマ番号をすべてラップする限り、変換は簡単です。

+0

ええと、コンバージョンやカスタムシリアル化の処理方法に関するガイドはありますか?私が最後にバイナリのシリアル化を試みたとき、コードを変更した後に古いシリアル化されたデータを開くことができなくなってしまいました。 – Davy8

+0

私は助けてくれることを望む例を加えました。 – onedozenbagels

2

System.Data.SQLiteを使用することをお勧めします。これは、ADO.netインターフェースを使用した簡単で高性能なSQLを提供し、軽量です。また、コマンドラインのsqlite.exeクライアントと他のツールを使用して、トラブルシューティングも簡単に文書化できます。 SQLiteの大きなメリットの1つは、比較的緩い型付けなので、スキーマを乱す時間を費やす必要がないということです。

LINQをサポートしているかどうかは分かりませんが、かなり良いです。

+0

OPと同じ種類のパーシスタンスソリューションを探していますが、これは私の目的のためには完全です。 +1。 –

関連する問題