- PR -

.NET FrameworkでのXMLファイルによるAPL設定情報保持方法

投稿者投稿内容
珍平
会議室デビュー日: 2002/10/29
投稿数: 10
投稿日時: 2003-03-06 09:55
.NET FrameworkでのAPL設定情報保持方法は、iniファイルやレジストリに格納する方法に加え、
XMLファイルで情報を保持することができるそうで、
http://www.microsoft.com/japan/msdn/net/general/persistappsettnet.asp
を探して調べたのですが、いまいちよくわかりません。

具体的に、
・レジストリへの格納する方法に比べてのメリット(デメリット)
・設定したXMLファイルはバイナリ化できるか(ユーザが簡単にいじれないようにしたい)
・レジストリのように、複数のAPLが同時に同じXMLファイルへアクセスできるのか
・制限ユーザ(アクセス制限のあるユーザ)への対応はどのようにおこなっているのか
 (例えば、Documents and Settings配下のユーザフォルダにXMLファイルを用意する等)
以上のことを知りたいのです。

情報が載っているサイトのURLでも構いません。
ご存知の方がいらっしゃいましたら、ご教授いただきたいと思います。
小野@どっとねっとふぁん
ぬし
会議室デビュー日: 2001/10/30
投稿数: 402
投稿日時: 2003-03-06 10:40
とりあえず今の私の理解として。。。

> ・レジストリへの格納する方法に比べてのメリット(デメリット)

レジストリを利用しないことが一番のメリットでは(^^;
dllヘルの一因はレジストリにあったと考えられているのだと思います。

> ・設定したXMLファイルはバイナリ化できるか(ユーザが簡単にいじれないようにしたい)

できるという記述はみたことがないですね。
中に記述されている情報は暗号化しておくことは可能でしょうね。
当然復号化の手間はいるでしょうけど。

> ・レジストリのように、複数のAPLが同時に同じXMLファイルへアクセスできるのか

Windowsアプリの場合、設定ファイルは「アプリ名.exe.config」という
固定の名称になります。
なので、複数のアプリケーションで設定ファイルを利用する、ということは
考えられていないと思います。
ま、設定ファイルとは別に自分でXMLファイルに設定書き込んで利用するなら、
それを複数のアプリケーションから読む分には問題ないでしょけど。

> ・制限ユーザ(アクセス制限のあるユーザ)への対応はどのようにおこなっているのか
>  (例えば、Documents and Settings配下のユーザフォルダにXMLファイルを用意する等)

設定ファイルはアプリケーションと同じフォルダ内にある必要があります。
アプリケーションの入っているフォルダに制限をかける、という方法が
ひとつあるかな。
あとは、ユーザのアカウントやロールによって動作の制限を行うことも
可能だと思います。このあたりはまだよくわかってないですが(^^;
そうなると、これはプログラミング側の話になってきますね。


NothingButXMLInfoSet
大ベテラン
会議室デビュー日: 2002/07/16
投稿数: 116
投稿日時: 2003-03-06 11:17
私も私なりの解釈ですが。

引用:

珍平さんの書き込み (2003-03-06 09:55) より:
・レジストリへの格納する方法に比べてのメリット(デメリット)
・設定したXMLファイルはバイナリ化できるか(ユーザが簡単にいじれないようにしたい)
・レジストリのように、複数のAPLが同時に同じXMLファイルへアクセスできるのか
・制限ユーザ(アクセス制限のあるユーザ)への対応はどのようにおこなっているのか
 (例えば、Documents and Settings配下のユーザフォルダにXMLファイルを用意する等)
以上のことを知りたいのです。


XMLの構成ファイルは、アプリケーションの構成ファイルであって、珍平さんがおそらく想定されているような、ユーザーごとのプロファイル設定保存ファイルではありません。つまり、このファイルを作成するのはアプリケーションの開発者(あるいは配布元)であり、更新するのはアプリケーション管理者です。日々アプリケーションを利用するユーザーは、このファイルを見ることも更新することもありません。つまり、ユーザー固有の情報(終了時のウィンドウの位置とか、最近使ったファイルとか)を保存する場所ではないのです。

このことは、shuさんがおっしゃっているとおり、アプリケーションと同じフォルダに配置しなければならないことが如実に示しています。珍平さんのおっしゃるとおり、アプリケーションがおかれている場所やレジストリは通常ユーザーは書き込みできません。つまり、そのような書き込みは最初から想定されていないのです。

ユーザーごとの情報を保管するには、まったく別の仕組みを自分で作る必要があります。その際の保管場所としては、例えばIsolatedStorageが考えられます。あるいはユーザープロファイルの中でもいいでしょう。いずれにしても、ユーザーごとの設定情報のようなものは、アプリケーション自体の構成情報ではないので、アプリケーションの構成ファイルに書き込むべきではありません。別の方法を独自に開発するしかないでしょう。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-03-06 16:35
こんにちは。

 保存の方法ですが、2種類あります。1つは『バイナリシリアル化』で、簡単にクラスそのものをシリアル化(保存)し、シリアル化解除(復元)できます。もう1つは『XMLシリアル化およびSOAPシリアル化』で、こちらはクラスを完全には復元できません。
 ところが、テキストも一種のバイナリですので、バイナリシリアル化を使ってテキスト形式にシリアル化することもできます。テキスト形式にシリアル化すると、XMLとしてみることができます。

 この方法はとても簡単で、参照されている記事の中程、「カスタム アプリケーション構成クラスを作成する」のように、まずアプリケーションで保存したい設定だけを集めたクラスを作成します。記事中に書かれているように、Colorなど一部のクラス/型については事前に変換する必要があります。(ただし、この方法はご参照記事とは関係ありません
 次に、先のクラスに「Serializable」属性を付けます。
VB
<Serializable> Public Class ...
C#
[Serializable] public class ...
この属性は継承されないので注意してください。
 最後に、プロジェクトに「System.Runtime.Serialization.Formatters.Soap」への参照を追加します。

シリアル化はこうします。
System.IO.FileStream strm = new System.IO.FileStream(FileName
, FileMode.Create, FileAccess.Write);
System.Runtime.Serialization.Formatters.Soap.SoapFormatter formatter
= new System.Runtime.Serialization.Formatters.Soap.SoapFormatter();
formatter.Serialize(strm, Variable);
strm.Close();

シリアル化解除はこうします。
System.IO.FileStream strm = new System.IO.FileStream(FileName
, System.IO.FileMode.Open);
System.Runtime.Serialization.Formatters.Soap.SoapFormatter formatter
= new System.Runtime.Serialization.Formatters.Soap.SoapFormatter();
Variable = formatter.Deserialize(strm);
strm.Close();

#別のスレッド用に研究中なので、質問されても答えられるかどうかはわかりません。

 なお、可視文字として、しかもXMLとして保存するというのは“大変高くつく”ということをご留意ください。“安くあげる”には不可視文字で保存すればよいのですが、その時にはSoapFormatterの代わりにBinaryFormatterを使用します。

 この方法ではクラスをそのまま出力するため、将来クラスを変更したときに設定ファイルが使えません(たぶん)。詳しくはヘルプを参照してください。
MSDNオンライン

[ メッセージ編集済み 編集者: Jitta 編集日時 2003-03-06 16:50 ]
珍平
会議室デビュー日: 2002/10/29
投稿数: 10
投稿日時: 2003-03-07 16:37
shu様、NothingBut.NETFX様、Jitta様。
ご返答ありがとうございます。
大変参考になりました。

いくつか疑問に思ったことがありました。

そもそもXMLファイルでのAPL情報格納方法は、レジストリのように扱えるのでしょうか、
レジストリでは、制限ユーザでも以下のサブキーやサブディレクトリのみ書き込みが可能です。
 −HKEY_CURRENT_USER
 −CSIDL_PROFILE
 −CSIDL_COMMON_DOCUMENTS
XMLファイルでも、制限ユーザでも書き込める同様な仕組みがあるのでしょうか。
参照サイトでは、各ユーザごとのプロパティ等についての記述があり、
制限ユーザでも設定の格納ができるように読み取れます。

Jitta様への質問になってしまうと思うのですが、
MSDN内の「オブジェクトのシリアル化」について読んだのですが、
「バイナリシリアル化」はできないのでしょうか?
つまり、XMLファイルをバイナリで保存はできるのかということです。

お手数をおかけいたしますが、よろしくお願い致します。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-03-07 18:54
こんにちは。

引用:

珍平さんの書き込み (2003-03-07 16:37) より:
MSDN内の「オブジェクトのシリアル化」について読んだのですが、
「バイナリシリアル化」はできないのでしょうか?
つまり、XMLファイルをバイナリで保存はできるのかということです。



 だから、テキストもバイナリの一種です。すみません、おふざけです。

 というか、不可視文字で保存したら、XMLでなくなります。XMLの仕様書で、
『XMLの目標は、任意のSGML文書を、HTMLがWebで行っているように配布、受信、処理できるようにすること』(『やさしく読む「XML 1.0 勧告」』より)
なので、不可視文字で保存すると、この目的にそぐわなくなります。

 それとも、タグの内側、データの部分を不可視文字列化するということでしょうか。

 逆にお尋ねしますが、いえ、自問してください。ご心配されていることは、そういったクラスを作るのにかかるコストに見合いますか?



 『ユーザが簡単にいじれないように』ということであれば、提示したXMLバイナリシリアル化(SoapFormatter)で十分です。タグ、というか、リファレンスをたどるのは、構造がわかっていても至難の業です(--;。
#いじろうとしていじれなかったらしい...
 そもそも、「XML」と「バイナリ」にこだわる必要があるのでしょうか。2つを同時に満たそうとするから難しいのではないでしょうか。

 ユーザごとの配慮については、Applicationクラスのプロパティによって、ファイルを書き出す場所を変更すればよいのではないでしょうか。詳しくはヘルプを見てください。「C:\Documents And Settings\ユーザ\Application Data」へのパスが拾えます。ここは、制限ユーザだろうがなんだろうが、ローカルPCから実行している限り、書き込むことができます。リモートPCから実行しているなら、管理者だろうが書き込めません。

[ メッセージ編集済み 編集者: Jitta 編集日時 2003-03-07 19:38 ]
珍平
会議室デビュー日: 2002/10/29
投稿数: 10
投稿日時: 2003-03-07 22:37
Jitta様、こんXXは。

ご返答いただきありがとうございます。

無茶な質問をしまって申し訳ございません。
確認のつもりで書かせていただきました。
バイナリ化とXML化は別に考えるべきだということですね。

わざわざお付き合い下さり、ありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-03-09 00:03
こんにちは。

>>バイナリ化とXML化は別に考えるべきだということですね。

 別に考えるのではなく、もっと根本の問題です。「バイナリ」とは、どういう意味で使われていますか?たとえば、私は「バイナリ」ではなく、「不可視文字」という言葉を使っていますよね。しかし、これもある意味正しくありません。なぜなら、S-JIS環境下でUTF-8のテキストファイルを開けば、不可視なのですから。その意味で、MSDNには「バイナリシリアル化」の中に「XMLシリアル化」もありましたよね(今ヘルプファイルが手元にないので確認不可)。何度か書いているように、テキストもバイナリなのです。ただ、特定の環境下では人間が認識可能な文字列となるだけなのです。つまり、XMLファイルもバイナリファイル(の特殊な形)なのです。

 そこで、もう一度おたずねしますが、「XMLをバイナリで出力」とは、どういう意味でおっしゃっているのでしょうか。なぜ「XMLで出力したい」とお考えなのでしょうか。私としては、「XMLで出力する=確認を容易にする」と受け取っているのですが、それを「バイナリ」、つまり容易に確認できないように出力したい、というのが矛盾しているように思うのです。


 とはいえ、一応の解決策も提示しているつもりです。SoapFormatterとBinaryFormatterを紹介していますが、「見せるだけ」のファイルと「実際に使う」ファイルを分ければ、「簡単に確認できるけど、簡単に変更できない」仕組みを作ることは可能です。

スキルアップ/キャリアアップ(JOB@IT)