アプリケーションでデプロイするには、読み取り専用データをどのように保存すればよいですか?


17

私はデスクトップアプリケーションを開発しており、このアプリケーションを実行するにはいくつかの情報が必要ですが、この情報は変更されません(アプリの実行ごとにデータを読み込む必要ありますが、データは変更されません)。データは、アプリを実行しているコンピューターと同じコンピューターに保存する必要があります(クライアント側のストレージ?)。

また、ユーザーがこの情報を簡単に変更できない場合も優れています(ITの知識があまりないと仮定します)。

この種の情報はどのように保存すればよいですか?ローカルデータベース?アプリケーションと共に送信されるXML

WPFを使用しています。


2
これはメタではありません。メタは、質問が行われる主要なサイトに関する問題や懸念を議論するサイトです。
jpmc26

1
ユーザーに情報を変更してほしくないのはなぜですか?それはセキュリティ上の懸念ですか?この情報はユーザーから秘密にされるべきですか?理由により、適切な答えが大きく変わる可能性があります。
jpmc26

1
@ jpmc26まあ、それはセキュリティ上の問題のようなものですが、大したことではありません。このアプリケーションの主な目的は、シリアルポートを介して温度コントローラー(このような もの)と通信することであり、XMLはコントローラーのメモリアドレスに関する情報を保存します。ユーザーが変更すると、実行中に問題が発生する可能性があるため、回避したいと思います。しかし、私が言ったように、それはただの懸念であり、大したことではありません。PS:交換する質問編集したメタのためにSEを。ありがとう。
appa yip yip

2
ローカルデータベースが必要な場合は、SQLiteをご覧ください。(ただし、データが起動時にRAMにロードするのに十分小さい場合、jsonまたはバイナリのような単純な構造化ファイルを好む)
-CodesInChaos

1
「ユーザーが変更すると、実行中に問題が発生する可能性があるため、回避したいと思います。」セキュリティ上の懸念のようには思えません。セキュリティ上の懸念とは、ファイルにパスフレーズなどがある場合です。実行可能ファイルの横にあるXMLファイルに設定を配置し、上部に「このファイルの設定に手を触れないでください!!」というコメントを入力してください。ユーザーがインストールディレクトリ内のランダムなファイルを編集している場合、それらは取得した破損に値します。
ロジャーリップスコム

回答:


14

明らかな答えはバイナリファイルですが、それはどのようにロードしているかに依存します-可能であれば、あなた自身の生活を楽にするかもしれません。

XMLは、これを読み取るためのC#のメソッドが組み込まれているため、適切な選択肢です。データにチェックサムを追加して、ユーザーが変更した場合、チェックサムが一致しないようにすることができます(チェックサムが有効であることを確認するためにチェックを追加する必要があります)

ローカルデータベースには、アクセスできる必要がある他の依存関係があるため、より多くの問題が発生する可能性があります


私はチェックサムについて考えていませんでした、それは本当に素晴らしいアイデアです。したがって、チェックサムを生成してアプリケーションに保存するので、XMLのシリアル化を解除するたびに、新しいチェックサムを生成して最初のチェックサムと比較しますか?
appa yip yip

4
チェックサムをアプリケーションに保存する場合、異なる構成を許可することはないため、構成データをアプリケーション定数としてコードに保存することもできます。将来構成を変更できるようにする場合は、XMLのフィールドとしてチェックサム(より適切な用語は「ハッシュ」)を追加し、それを使用してXMLが改ざんされていないことを確認します。もちろん、熱心な攻撃者はコードを調査し、ハッシュロジックを見つけてそれを使用して有効なXMLファイルを生成できますが、とにかくクライアント側のアプリケーションは常に決定された攻撃者に対して脆弱です。
SJuan76

4
ファイルまたはローカルデータベースの代わりに、アセンブリに埋め込まれたリソースファイルの方が適しています。エンドユーザーから隠され、開発者が簡単に管理できますが、パワーユーザーフレンドリーです。パフォーマンスが懸念される場合、バイナリシリアル化が優れています。
PTwr

@ SJuan76ええ、XMLのハッシュの問題は、誰かがシリアル化を解除すると変更できることです。とにかく、XMLが変更された場合(それは起こらないと思いますが、誰が知っているか)、それはアプリの新しいバージョンでのみ変更されるので、コードのハッシュに固執すると思います。
appa yip yip

2
@schmaedeck:リソースファイルは、実行可能バイナリ内の文字通りのファイルです。アイコンと文字列、およびプログラムに必要なその他の定数データ。
Mooingダック

21

データが変更されず読み取り専用である場合は、定数のリストとしてコードファイルに入れてください。

public readonly string AppStartUpData = "MyAppNeedsThis";

このデータがデプロイメントごとに異なる場合、外部ファイルは問題ありません。

.Netには、組み込みの.configファイル(App.Config)が付属しています。フレームワークに組み込まれた標準的な方法があるため、それらから情報を読み取る必要があります。

設定ファイルはテキストファイル(Xml)であるため、設定を変更する必要がある場合(決してしない)に構成ファイルを使用します。機密情報がある場合、必要に応じて設定を暗号化できます。


私は定数/読み取り専用について考えました、問題は大量のデータがあるということですので、私は外部ファイルをフォローアップすると思います。ありがとうございました!
appa yip yip

5
@schmaedeck ...そうですか?これらの定義を別のファイルに入れて、それをインポートできます。実際、Qtはフォームやものをコンパイルするときにこの種のことをするので、いくつかの定数にメガバイトのバイナリデータ(たとえば画像)を持つ自動生成ファイルになりますが、別のファイルにある場合は何も問題はありません。
バクリウ

15

いつでもファイルをプロジェクトに追加し、ビルドタイプをに設定しEmbedded Resourceて、アプリケーション自体に直接埋め込むことができます。

または、暗号化されてアクセス可能な場所に配置されたファイル。


1
これが最良の答えです。私はそれを達成する方法について、より多くのガイダンスを見たいと思います。潜在的に変更可能な構成ファイルの利点は得られますが、アセンブリに埋め込まれているため、静的に保つことができます。
ガスドール

5

ユーザーがデータを覗き見したくない場合は、バイナリデータファイルにシリアル化する必要があります。

アプリからのみ、読み取るチャンクの長さがわかります。

私はC#を知りませんが、Javaでは次のようなファイルを作成します:

FileOutputStream fos = new FileOutputStream(file);      
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(var1);
oos.writeObject(var2);
oos.writeObject(var3);
oos.writeObject(var4);

...そして、彼らは次のようにそれを読みます:

FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Object o[] = new Object[4];
o[0] = ois.readObject();
o[1] = ois.readObject();
o[2] = ois.readObject();
o[3] = ois.readObject();

必ずバイナリシリアル化を使用します。お時間をありがとうございました!
APPAイップ・イップ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.