ファイル格納処理および XML シリアル化処理のカスタマイズ
ユーザーが保存したとき Visual Studio のドメイン固有言語のインスタンスまたは (DSL) モデルは XML ファイルの作成または更新されます。 ファイルがストアのモデルを再作成するために再度読み込むことができます。
DSL *** Xml Serialization Behavior *** エクスプローラーのの下に設定を調整してシリアル化の設定をカスタマイズできます。 すべてのドメイン クラスプロパティおよびリレーションシップの *** Xml Serialization Behavior *** の下にノードがあります。 リレーションシップはソース クラスの下にあります。 シェイプとコネクタ図のクラスに対応するノードがあります。
また高度なカスタマイズのプログラム コードを記述できます。
注意
特定の形式のモデルを保存するとそのフォームから再度読み込む場合はカスタムのシリアル化の設定ではなくモデルからの出力を生成するとテキスト テンプレートを使用することを検討してください。詳細については、「ドメイン固有言語からのコード生成」を参照してください。
モデルと図ファイル
各モデルは通常2 種類のファイルに格納されます :
モデル ファイルに Model1.mydsl などの名前が付いています。 これはモデル要素および関係プロパティと保存します。 .mydsl などのファイル拡張子は DSL の定義 ENT1ENT [入力] ノードの ENT0ENT [入力] プロパティのによって決まります。
図ファイルに Model1.mydsl.diagram などの名前が付いています。 これは図の外観のシェイプとコネクタ位置色行厚さなどの詳細を格納します。 ユーザーが .diagram のファイルを削除するとモデルの基本情報が失われない。 図のレイアウトは失われます。 モデル ファイルを開くとシェイプとコネクタの既定の設定が作成されます。
DSL のファイル拡張子を変更するには
DSL 定義を開きます。 DSL のエクスプローラーでエディターのノードをクリックします。
[プロパティ] ウィンドウで[入力] ENT1ENT プロパティを編集します。 頭文字を含めないでください。「 ファイル名の拡張子。
ソリューション エクスプローラーでDslPackage\ProjectItemTemplates の 2 種類の項目テンプレート ファイルの名前を変更します。 これらのファイルにはこの形式に従って名前が付いています :
myDsl.diagram
myDsl.myDsl
既定のシリアル化の設定
このトピックの例を作成するには次の DSL 定義が使用されました。
この DSL が画面の外観を持つモデルを作成するために使用されています。
このモデルはXML テキスト エディターに格納され再度開いています :
<?xml version="1.0" encoding="utf-8"?>
<familyTreeModel xmlns:dm0="https://schemas.microsoft.com/VisualStudio/2008/DslTools/Core" dslVersion="1.0.0.0" Id="f817b728-e920-458e-bb99-98edc469d78f" xmlns="https://schemas.microsoft.com/dsltools/FamilyTree">
<people>
<person name="Henry VIII" birthYear="1491" deathYear="1547" age="519">
<children>
<personMoniker name="/f817b728-e920-458e-bb99-98edc469d78f/Elizabeth I" />
<personMoniker name="/f817b728-e920-458e-bb99-98edc469d78f/Mary" />
</children>
</person>
<person name="Elizabeth I" birthYear="1533" deathYear="1603" age="477" />
<person name="Mary" birthYear="1515" deathYear="1558" age="495" />
</people>
</familyTreeModel>
シリアル化されたモデルについては次の点に注意してください :
各 XML ノードにドメイン クラス名と同じであって大文字は小文字で名前があります。 たとえば、familyTreeModel や person などです。
名前と BirthYear などのドメインのプロパティはXML ノードの属性としてシリアル化されます。 したがってプロパティ名の最初の文字を小文字に変換されます。
各リレーションシップは関係のソース端の入れ子である XML ノードとしてシリアル化されます。 ノードに小文字の最初の文字が含まれるソース プロパティのロールと同じ名前になっています。
たとえばDSL 定義はという名前のロールは PeopleFamilyTree のクラスに用意されています。 XML ではこれは familyTreeModel のノード内に入れ子にされた people という名前のノードによって表されます。
それぞれの埋め込みリレーションシップのターゲットの最後にはリレーションシップの下に入れ子になっているノードとしてシリアル化されます。 たとえばpeople のノードは person の複数のノードが含まれています。
各参照リレーションシップのターゲットがターゲットの最後の要素への参照をエンコードする モニカー としてシリアル化されます。
たとえばperson ノードでchildren のリレーションシップがあります。 このノードはモニカー (やなど) が含まれます :
<personMoniker name="/f817b728-e920-458e-bb99-98edc469d78f/Elizabeth I" />
各モニカー
モニカーをモデルのさまざまな部分に図ファイル間の相互参照を表すために使用されます。 .diagram ファイルではモデル ファイルのノードを参照するために使用されます。 モニカーの 2 とおりの形式があります :
ID のモニカーは ターゲット要素の GUID を引用します。 次に例を示します。
<personShapeMoniker Id="f79734c0-3da1-4d72-9514-848fa9e75157" />
修飾モニカーは モニカーの 主 キーと呼ばれる指定したドメインのプロパティの値によってターゲット要素を指定します。 ターゲット要素のモニカーはリレーションシップを埋め込みのツリー内の親要素のモニカーがプレフィックスとして付けられます。
次の例では Song というドメイン クラスに埋め込むリレーションシップを持つ Album というドメイン クラスから取得されますがDSL:
<albumMoniker title="/My Favorites/Jazz after Teatime" /> <songMoniker title="/My Favorites/Jazz after Teatime/Hot tea" />
モニカー名のキーが生成されたクラスにオプションが *** Xml Serialization Behavior *** の true に *** Is Moniker Key *** 設定されているドメインのプロパティが使用されます。 例ではこのオプションはドメイン クラス アルバム曲 「」および 「」の 「タイトル」というドメインのプロパティのセットです。
修飾される主モニカーを読んで ID のモニカーより簡単です。 ユーザーがモデル ファイルの XML には要素のキー モニカーを使用することを検討してください。 ただしユーザーが同じモニカー キーを使用して複数の要素を設定することもできます。 重複キーによりファイルが正しく再読み込みできます。 したがって修飾される主モニカーを使用して参照されるドメイン クラスを定義するとユーザーに重複したモニカーのファイルを格納することを防ぐ方法を検討する必要があります。
ID のモニカーを参照するドメイン クラスを設定するには
*** Is Moniker Key *** はクラスや基本クラスのすべてのドメインのプロパティの false であることを確認します。
DSL のエクスプローラーで <the domain class> \Element Data を ENT0ENT を配置する。
*** Is Moniker Key *** はドメインのプロパティの false であることを確認します。
ドメイン クラスの基本クラスがある場合はそのクラスの手順を繰り返します。
*** Serialize Id *** = ドメイン クラスの true を設定します。
このプロパティは *** Xml Serialization Behavior *** で検索できます。
修飾される主モニカーを参照するドメイン クラスを設定するには
既存のドメインのドメイン クラスのプロパティの *** Is Moniker Key *** を設定します。 プロパティの型は string である必要があります。
DSL のエクスプローラーで <the domain class> \Element Data を ENT5ENT を展開し次にドメインのプロパティを選択します。
[プロパティ] ウィンドウでtrue に *** Is Moniker Key *** を設定します。
または
[入力] ENT1ENT のツールを使用して新しいドメイン クラスを作成します。
このツールは名前というドメインのプロパティを含む新しいクラスを作成します。 このドメインのプロパティの *** Is Element Name *** と *** Is Moniker Key *** のプロパティは true に初期化されます。
または
ドメイン クラスのモニカーの主要なプロパティを持つ別のクラスの継承関係を作成する。
重複したモニカーの回避
修飾される主モニカーを使用するとユーザー モデルの 2 種類の要素はキー プロパティの値がある可能性があります。 たとえばDSL にプロパティ名を持つクラスのメンバーがある場合ユーザーは同じになるように2 種類の要素の名前を設定することができます。 モデルはファイルに保存できますが正しく再読み込みを行いません。
この状況を回避できる複数のメソッドがあります :
主 *** Is Element Name *** = ドメインのプロパティの true を設定します。 DSL 定義図のドメインのプロパティを選択し[プロパティ] ウィンドウで値を設定します。
ユーザーがクラスの新しいインスタンスを作成する場合この値により自動的に異なる値を割り当てるドメインのプロパティ。 既定の動作はクラス名の末尾に数字を追加します。 これはユーザーがモデルを保存する前に値を設定しないとユーザーが重複するには名前を変更する場合に使用することもできます。
DSL のように実行します。 DSL のエクスプローラーの [エディター \ 検証は true に***** Uses... ***** のプロパティを設定します。
あいまいさを確認する自動生成された検証メソッドがあります。 メソッドは Load の検証のカテゴリにあります。 これによりファイルを再度開くことができない可能性があるユーザーに警告されていることを確認します。
詳細については、「ドメイン固有言語における検証」を参照してください。
モニカーのパスと修飾子
修飾モニカーはモニカーの主キーによって終了ツリー内の親モニカーが付けられます。 たとえばアルバムのモニカーがの場合 :
<albumMoniker title="/My Favorites/Jazz after Teatime" />
次にアルバムの曲の 1 つは次のように指定できます :
<songMoniker title="/My Favorites/Jazz after Teatime/Hot tea" />
ただしID がアルバムではなく参照する場合は次のようにモニカーを使用して :
<albumMoniker Id="77472c3a-9bf9-4085-976a-d97a4745237c" />
<songMoniker title="/77472c3a-9bf9-4085-976a-d97a4745237c/Hot tea" />
GUID は一意であるため親のモニカーによってプレフィックスとして付けられないことに注意してください。
特定のドメインのプロパティにモデル内の値が存在することがわかっている場合はそのプロパティの true に *** Is Moniker Qualifier *** を設定できます。 これにより親のモニカーを使用せずに修飾子として使用します。 たとえばアルバムのクラスのタイトル ドメインのプロパティの *** Is Moniker Qualifier *** と *** Is Moniker Key *** 設定するとモデルの名前がアルバムとその子に対してモニカーまたは識別子を使用できません :
<albumMoniker name="Jazz after Teatime" />
<songMoniker title="/Jazz after Teatime/Hot tea" />
XML 構造のカスタマイズ
次のカスタマイズを行うにはDSL エクスプローラーの [ENT0ENT] ノードを展開します。 ドメイン クラスにはこのクラスに用意されているリレーションシップおよびプロパティの一覧を表示するには要素のデータのノードを展開します。 リレーションシップを選択し[プロパティ] ウィンドウのオプションを調整します。
ターゲット要素はリスト ノードにソースのロールをスキップするように調整するように *** Omit Element *** を設定します。 ソースとターゲット クラスの間に複数の関係がある場合はこのオプションを設定する必要があります。
<familyTreeModel ...> <!-- The following node is omitted by using Omit Element: --> <!-- <people> --> <person name="Henry VIII" .../> <person name="Elizabeth I" .../> <!-- </people> --> </familyTreeModel>
リレーションシップのインスタンスを表すノードをリンク先ノードを埋め込むに *** Use Full Form *** を設定します。 このオプションはドメイン リレーションシップにドメインのプロパティを追加すると自動的に設定されます。
<familyTreeModel ...> <people> <!-- The following node is inserted by using Use Full Form: --> <familyTreeModelHasPeople myRelationshipProperty="x1"> <person name="Henry VIII" .../> </familyTreeModelHasPeople> <familyTreeModelHasPeople myRelationshipProperty="x2"> <person name="Elizabeth I" .../> </familyTreeModelHasPeople> </people> </familyTreeModel>
*** Representation *** = 要素 を属性値としてではなく要素として格納されるドメインのプロパティを持つように設定します。
<person name="Elizabeth I" birthYear="1533"> <deathYear>1603</deathYear> </person>
属性を使用してリレーションシップをシリアル化する順序を変更するには項目のデータを要素の下にあるを右クリックし 上へ移動 または ENT1ENT [入力] メニューのコマンドを使用します。
プログラム コードを使用してメインのカスタマイズ
コンポーネントまたはシリアル化のアルゴリズムすべてを置き換えることができます。
またDsl\Generated Code\Serializer.cs と SerializationHelper.cs のコードを調査することをお勧めします。
特定のクラスのシリアル化をカスタマイズするには
*** Xml Serialization Behavior *** の下にそのクラスのノードの *** Is Custom *** を設定します。
すべてのテンプレートが変換されてソリューションをビルドして結果のコンパイル エラーを調査します。 各エラーの近くにコメントはコードを提供する方法について説明します。
全体に独自のシリアル化を提供するためにシミュレートします。
- Dsl GeneratedCode \ \ SerializationHelper.cs のオーバーライド メソッド
XML シリアル化の動作のオプション
DSL のエクスプローラーでXML シリアル化の動作のノードは各ドメイン クラスリレーションシップコネクタ図形と図のクラスの子ノードが表示されます。 これらの各ノードの下で要素に指定されたプロパティとリレーションシップの一覧です。 リレーションシップはソースのクラスで表されます。
次の表はDSL 定義のこのセクションで設定できるオプションを示します。 どちらの場合もDSL のエクスプローラーで要素を選択し[プロパティ] ウィンドウのオプションを設定します。
XML クラスのデータ
これらの要素は *** Xml Serialization Behavior\Class Data *** の下の DSL のエクスプローラーにあります。
プロパティ |
Description |
カスタム要素のスキーマがあります。 |
true の場合ドメイン クラスにカスタム要素のスキーマがあることを示しています。 |
カスタムです。 |
このドメイン クラスに対して独自のシリアル化と逆シリアル化コードを作成する場合は true にを設定します。 ソリューションをビルドし詳細な手順を検出するエラーを調査します。 |
ドメイン クラス |
このクラスのデータのノードが適用されるドメイン クラス。 読み取り専用です。 |
要素名 |
このの要素の XML ノードのクラス名。 既定値はドメイン クラス名を小文字のバージョンです。 |
モニカー属性名 |
参照を含めるにはモニカーの要素で使用する属性の名前。 キー プロパティには名前または ID が使用されます。 この例では「名前」 : <personMoniker name="/Mike Nash"/> |
モニカーの要素名 |
このクラスの要素を示すモニカーに使用する XML 要素の名前。 既定値は 「モニカーを」サフィックスを付けるクラス名の小文字バージョンです。 たとえば、personMoniker のようにします。 |
モニカーの型名 |
このの要素にモニカーに対して生成される xsd クラスの型の名前。 XSD は Dsl\Generated Code\*Schema.xsd に示します。 |
ID をシリアル化します。 |
true の場合要素の GUID が含まれます。 これはマークされた *** Is Moniker Key *** でDSL がこのクラスへの参照の関係を定義するプロパティがない場合に true である必要があります。 |
[型の名前] |
指定したドメイン クラスから xsd で生成された XML の型の名前。 |
説明 |
この要素に関連付けられた非公式のメモ |
XML データのプロパティ
XML ノードはクラスのプロパティ ノードの下にあります。
プロパティ |
Description |
ドメインのプロパティ |
xml のシリアル化の構成データが適用されるプロパティ。 読み取り専用です。 |
モニカーのキーです |
true の場合このプロパティはドメイン クラスのインスタンスを参照するモニカーを作成するためのキーとして使用されます。 |
モニカーの修飾子です |
true の場合プロパティはモニカーに修飾子を作成するために使用されます。 false の場合SerializeId がこのドメイン クラスにもモニカー場合は埋め込むツリー内の親要素のモニカーで修飾します。 |
表現 |
属性はXML の属性としてシリアル化されている場合プロパティ ; 要素要素としてシリアル化されます。; Ignoreシリアル化されません。 |
XML の名前 |
プロパティを表す XML 要素の属性またはに使用する名前。 既定ではこれはドメインのプロパティ名と小文字のバージョンです。 |
説明 |
この要素に関連付けられた非公式のメモ |
XML データのロール
ロール データ ソース クラスのノードはノードの下にあります。
プロパティ |
Description |
---|---|
カスタムモニカーがあります。 |
この関係を走査するモニカーを生成し解決するための独自のコードを記述する場合はこれを true に設定します。 詳細についてはソリューションをビルドしエラー メッセージをダブルをクリックします。 |
ドメイン リレーションシップ |
このオプションが適用される関係を指定します。 読み取り専用です。 |
要素を削除します。 |
true の場合ソースのロールに対応する XML ノードはスキーマから除外されます。 ソースとターゲット クラスの間に複数の関係がある場合はノードこのロールは 2 種類の関係に属するリンクが区別されます。 このためこの場合はこのオプションを設定しないことをお勧めします。 |
要素名のロール |
ソースのロールから派生した XML 要素の名前を指定します。 既定値はプロパティ名の役割です。 |
完全なフォームを使用します。 |
true の場合各ターゲットのモニカーは要素または関係を表す XML ノードで囲まれています。 これはリレーションシップに独自のドメインのプロパティがの場合 true に設定する必要があります。 |