自訂檔案儲存體和 XML 序列化

當使用者儲存工作執行個體,或模型,定義域專屬語言 (DSL) 中的Visual Studio,XML 檔案所建立或更新。可以重新載入檔案,才能重新建立存放區中的模型。

您可以自訂的序列化機制,藉由調整] 下的設定 Xml 序列化行為 DSL 總管] 中。沒有下的節點 Xml 序列化行為的每個網域類別、 屬性和關聯性。關聯性都位於它們的來源類別。另外還有節點對應至圖案、 接頭以及圖表的類別。

您也可以撰寫更進階的自訂程式碼。

注意事項注意事項

如果您想要以特定的格式,儲存模型,但您不需要重新載入這個檔案來自該表單,考慮使用文字範本來產生輸出從模型中,而非自訂序列化配置。如需詳細資訊,請參閱 從網域指定的語言產生程式碼

模型和圖表檔

每個模型通常會儲存在兩個檔案:

  • 模型檔案中有名稱為Model1.mydsl。它會儲存模型項目及關聯性和它們的屬性。檔案的副檔名,例如**.mydslFileExtension 屬性的編輯器** DSL 定義中的節點。

  • 圖表檔有名稱為Model1.mydsl.diagram。它會儲存圖形、 連接線和它們的位置、 色彩、 線條寬度和其他詳細資料的圖表的外觀。如果使用者刪除**.diagram**檔案中,模型中的重要資訊不會遺失。圖表的配置將會遺失。模型檔案開啟時,預設設定的圖形,並將建立連接器。

若要變更的 DSL 副檔名

  1. 開啟 [DSL 定義]。在 DSL 總管] 中,按一下 [編輯器] 節點。

  2. 在 [屬性] 視窗中,編輯 FileExtension 屬性。不包含在開頭的 「。"的副檔名。

  3. 在 [方案總管] 中,變更兩個項目範本中的檔案名稱DslPackage\ProjectItemTemplates。這些檔案都遵循這種格式的名稱:

    myDsl.diagram

    myDsl.myDsl

預設序列化配置

若要建立此主題的範例,請使用下列的 DSL 定義。

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 定義中,角色名為People取得的資料來源在FamilyTree類別。這會在 XML 中,以指明的節點people套疊在familyTreeModel節點。

  • 目標端的每個內嵌的關聯性已序列化為巢狀結構下的關聯性的節點。例如, people節點包含數個person的節點。

  • 目標端的每個參考關聯性已序列化為 moniker,它會將編碼目標項目的參考。

    比方說,在person節點,可以有children關聯性。這個節點包含 moniker 如所示:

    <personMoniker name="/f817b728-e920-458e-bb99-98edc469d78f/Elizabeth I" />
    

了解對 Moniker

對 moniker 用來代表不同的組件的模型和圖表檔案之間的交互參照。也可用在.diagram模型檔中的節點參照的檔案。有兩種形式的 moniker:

  • 識別碼對 moniker 加註引號的目標項目的 GUID。例如:

    <personShapeMoniker Id="f79734c0-3da1-4d72-9514-848fa9e75157" />
    
  • 限定索引鍵對 moniker 稱為 moniker 金鑰指定的網域屬性的值來識別目標項目。目標項目的 moniker 是由其父項目,在樹狀目錄中的內嵌關聯性的 moniker 的前置字元。

    下列範例是取自 DSL 裡面有是名為 [專輯] 類別已命名的歌曲內嵌關聯到網域的網域類別:

    <albumMoniker title="/My Favorites/Jazz after Teatime" />
    <songMoniker title="/My Favorites/Jazz after Teatime/Hot tea" />
    

    如果目標類別有定義域屬性的就會使用限定的索引鍵對 moniker 選項是 Moniker 金鑰設定為 [ true在 Xml 序列化行為。在範例中,這個選項設定名為 「 標題 」,在 「 專輯 」 和 「 歌曲 」 的網域類別中的網域內容。

合格的索引鍵對 moniker 會比識別碼 moniker 閱讀的工作變得更容易。如果您想要讀取的使用者模型檔的 XML,請考慮使用限定的索引鍵對 moniker。不過,很可能讓使用者能夠設定一個以上的項目具有相同的 moniker 金鑰。重複的索引鍵可能會導致檔案無法正確地重新載入。因此,如果您定義網域類別所限定的索引鍵對 moniker 的使用參考時,您應該考慮方法可以防止使用者儲存檔案具有重複的 moniker。

若要設定 ID moniker 所參考的網域類別

  1. 請確定是 Moniker 金鑰是false對於每個網域內的屬性的類別和其基底類別。

    1. 在 DSL 總管] 中,展開 Xml 序列化 Behavior\Class Data\< 網域類別 >\Element 資料

    2. 確認是 Moniker 金鑰是false的網域中的每個屬性。

    3. 如果網域類別有基底類別,重複該類別中的程序。

  2. 設定序列化識別碼 = true的網域類別。

    這個屬性可以在下找到 Xml 序列化行為

若要設定網域類別所限定的索引鍵對 moniker 參考

  • 設定是 Moniker 金鑰 ,則現有的網域類別網域屬性。屬性的型別必須是string。

    1. 在 DSL 總管] 中,展開 Xml 序列化 Behavior\Class Data\< 網域類別 >\Element 資料,然後選取 [網域] 屬性。

    2. 在 [屬性] 視窗中,設定是 Moniker 金鑰到true。

  • -或-

    建立新的網域類別使用名為網域類別工具。

    這個工具會建立新的類別具有名為名稱的網域屬性。是項目名稱是 Moniker 金鑰這個定義域屬性的屬性都會初始化成true。

  • -或-

    建立繼承關聯性從網域類別到另一個類別,包含 moniker 的索引鍵屬性。

Bb126447.collapse_all(zh-tw,VS.110).gif避免重複對 Moniker

如果您使用完整的索引鍵對 moniker,很可能在使用者的模型中的兩個項目無法有相同的值,在索引鍵屬性。比方說,如果您的 DSL 有類別都有屬性名稱的人,使用者可以設定兩個項目的名稱相同。雖然此模型可能會儲存到檔案,它就不會重新載入正確。

有數種方法,以避免發生這種情況:

  • 設定是項目名稱 = true關鍵的網域] 屬性。選取 DSL 定義圖表上的 [網域] 屬性,然後在 [屬性] 視窗中設定的值。

    當使用者建立新類別的執行個體時,這個值會使 [網域] 屬性,以自動指派不同的值。預設行為會將數字將類別名稱的結尾。這並不防止使用者重複出現,以變更名稱,但是使用者並不會將值設定之前先儲存模型時,很有用的情況。

  • 啟用 DSL 的驗證。DSL 總管] 中選取 Editor\Validation,並設定**使用...**屬性,以true。

    沒有自動產生的驗證方法,以檢查語意模糊。方法是在Load驗證類別。如此可確保它可能無法重新開啟該檔案會警告使用者。

    如需詳細資訊,請參閱 網域指定的語言中的驗證

Bb126447.collapse_all(zh-tw,VS.110).gifMoniker 路徑及辨識符號

合格的索引鍵 moniker moniker 該機碼,以結束,並加上內嵌的樹狀結構中父代的 moniker。例如,如果一張唱片的 moniker 為:

<albumMoniker title="/My Favorites/Jazz after Teatime" />

然後該專輯中的歌曲其中一項可能是:

<songMoniker title="/My Favorites/Jazz after Teatime/Hot tea" />

不過,如果專輯 diagram 識別碼相反地,然後對 moniker 為,如下所示:

<albumMoniker Id="77472c3a-9bf9-4085-976a-d97a4745237c" />
<songMoniker title="/77472c3a-9bf9-4085-976a-d97a4745237c/Hot tea" />

請注意 GUID 是唯一的因為它永遠不會以當做前置字元與其父系的 moniker。

如果您知道特定網域屬性每次都在模型內的唯一值,您可以設定是 Moniker 限定詞到true中的屬性。這會導致要做為辨識符號,而不需使用的父代 moniker。比方說,如果您將兩個設定是 Moniker 限定詞是 Moniker 金鑰標題網域專輯類別的屬性,模型的名稱或識別項不會用於對 moniker 的專輯和內嵌的子:

<albumMoniker name="Jazz after Teatime" />
<songMoniker title="/Jazz after Teatime/Hot tea" />

自訂 XML 的結構

若要使下列自訂作業,請展開 Xml 序列化行為 DSL 總管] 中的節點。網域類別,在項目資料節點展開以查看的屬性和關聯,以取得在這個類別資料來源清單。選取關聯性,並調整它的選項,在 [屬性] 視窗中。

  • 設定略過的項目略過來源角色節點,而只是目標項目的清單,則為 true。如果來源和目標類別之間有一個以上的關聯性,您不應該設定這個選項。

    <familyTreeModel ...>
      <!-- The following node is omitted by using Omit Element: -->
      <!-- <people> -->
        <person name="Henry VIII" .../>
        <person name="Elizabeth I" .../>
      <!-- </people> -->
    </familyTreeModel>
    
  • 設定使用完整的表單代表關聯性執行個體的節點中內嵌的目標節點。當您將網域內容新增至網域關聯性時,會自動設定這個選項。

    <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>
    
  • 設定表示 = 項目有定義域屬性,而不是做為屬性值的項目另存。

    <person name="Elizabeth I" birthYear="1533">
      <deathYear>1603</deathYear>
    </person>
    
  • 要序列化屬性和關聯性的順序,請以滑鼠右鍵按一下項目資料下的項目,並使用往上移下移功能表命令。

使用程式碼的主要自訂

您可以取代部分或全部的序列化演算法。

我們建議您研究中的程式碼Dsl\Generated Code\Serializer.csSerializationHelper.cs

若要自訂特定類別的序列化

  1. 設定是自訂 節點下的該類別中 Xml 序列化行為

  2. 轉換所有的範本、 建置解決方案,並調查結果的編譯錯誤。每個錯誤附近的註解說明您必須提供哪些程式碼。

若要提供您自己的序列化,供整個模型

  • 覆寫 Dsl\GeneratedCode\SerializationHelper.cs 的方法

在 Xml 序列化行為的選項

在 DSL 總管] 中,Xml 序列化行為的節點會包含每個網域類別、 關聯性、 圖形、 連接器及圖表類別的子節點。在每個節點是屬性和關聯性在該項目中取得資料來源的清單。關聯的表示,在他們自己的權限和它們的來源類別之下。

下表摘要說明您可以設定在本章節的 DSL 定義的選項。在每一種情況下,DSL 總管] 中選取一個項目,在 [屬性] 視窗中設定的選項。

Bb126447.collapse_all(zh-tw,VS.110).gifXml 類別資料

這些項目位於 DSL 總管] 的下方 Xml 序列化 Behavior\Class 資料

屬性

描述

具有自訂項目結構描述

如果為 True,表示網域類別自訂項目結構描述

為自訂

設定此屬性若為 true 以您想要撰寫這個網域類別自己序列化和還原序列化的程式碼。

建置方案並調查錯誤,找出詳細的指示。

網域類別

這個類別的資料節點所套用的網域類別。唯讀。

項目名稱

這個類別中的元素的 Xml 節點名稱。預設值會是小寫版本的網域類別名稱。

Moniker 屬性名稱

用於 moniker 的項目,以包含參考的屬性名稱。如果留白,則會使用索引鍵屬性或識別碼的名稱。

在這個範例中,它可以是"name":<personMoniker name="/Mike Nash"/>

Moniker 項目名稱

用來參考項目,這個類別的對 moniker 的 xml 項目的名稱。

預設值是字尾"Moniker"加上類別名稱的小寫版本。例如 personMoniker。

Moniker 型別名稱

產生這個類別的項目對 moniker 的 xsd 型別的名稱。XSD 位於Dsl\Generated Code\*Schema.xsd

序列化識別碼

如果為 True,GUID 的項目會包含在檔案中。這必須是如果本屬性為 true,如果無法使用屬性標記是 Moniker 機碼和 DSL 這個類別所定義的參考關聯性。

型別名稱

從指定的網域類別 xsd 中所產生的 xml 型別名稱。

備註

這個項目相關聯的非正式備忘稿

Bb126447.collapse_all(zh-tw,VS.110).gifXml 屬性的資料

[類別] 節點下找到的 Xml 屬性節點。

屬性

描述

網域屬性

Xml 序列化組態資料所套用的屬性。唯讀。

是 Moniker 索引鍵

如果為 True,會將屬性做為建立參考這個網域類別的執行個體的對 moniker 的索引鍵。

是 Moniker 辨識符號

如果為 True,屬性用於建立在對 moniker 的限定詞。若為 false,且 SerializeId 不是這個網域類別,則為 true,對 moniker 被限定在內嵌的樹狀目錄中的父項目的 moniker。

表示

如果屬性,屬性已序列化為 xml 屬性。 如果項目,它會序列化為項目。 如果略過],就無法序列化。

Xml 名稱

用於 xml 屬性或項目代表該屬性的名稱。預設情況下,這是網域的屬性名稱的小寫版本。

備註

這個項目相關聯的非正式備忘稿

Bb126447.collapse_all(zh-tw,VS.110).gifXml 角色資料

角色資料節點的節點下找到來源類別。

屬性

描述

具有自訂 Moniker

將此設為 true,如果您想要提供自己的程式碼,來產生及解決周遊此關聯性的 moniker。

如需詳細指示,請建置解決方案,,然後再按兩下 [錯誤訊息。

網域關聯性

指定要套用這些選項的關係。唯讀。

略過項目

如果為 true,則會省略的 XML 節點相對於來源角色從結構描述。

如果來源和目標類別之間有一個以上的關聯性,此角色] 節點會區別屬於兩個關聯的連結。因此建議您還是要不設定這個選項在此情況下。

角色的項目名稱

指定 XML 項目是衍生自來源角色的名稱。預設值是 「 角色 」 屬性名稱。

使用完整的表單

如果為 true,每個目標項目或 moniker 住 XML 節點代表的關聯性。這應該設為 true,如果關聯性有它自己網域的內容。

請參閱

概念

巡覽及更新程式碼中的模型

其他資源

從網域指定的語言產生程式碼