自訂檔案儲存體和 XML 序列化
當使用者儲存工作執行個體,或模型,定義域專屬語言 (DSL) 中的Visual Studio,XML 檔案所建立或更新。 可以重新載入檔案,才能重新建立存放區中的模型。
您可以自訂的序列化機制,藉由調整] 下的設定 Xml 序列化行為 DSL 總管] 中。 沒有下的節點 Xml 序列化行為的每個網域類別、 屬性和關聯性。 關聯性都位於它們的來源類別。 另外還有節點對應至圖案、 接頭以及圖表的類別。
您也可以撰寫更進階的自訂程式碼。
注意事項 |
---|
如果您想要以特定的格式,儲存模型,但您不需要重新載入這個檔案來自該表單,考慮使用文字範本來產生輸出從模型中,而非自訂序列化配置。如需詳細資訊,請參閱 從網域指定的語言產生程式碼。 |
模型和圖表檔
每個模型通常會儲存在兩個檔案:
模型檔案中有名稱為Model1.mydsl。 它會儲存模型項目及關聯性和它們的屬性。 檔案的副檔名,例如**.mydsl由 FileExtension 屬性的編輯器** DSL 定義中的節點。
圖表檔有名稱為Model1.mydsl.diagram。 它會儲存圖形、 連接線和它們的位置、 色彩、 線條寬度和其他詳細資料的圖表的外觀。 如果使用者刪除**.diagram**檔案中,模型中的重要資訊不會遺失。 圖表的配置將會遺失。 模型檔案開啟時,預設設定的圖形,並將建立連接器。
若要變更的 DSL 副檔名
開啟 [DSL 定義]。 在 DSL 總管] 中,按一下 [編輯器] 節點。
在 [屬性] 視窗中,編輯 FileExtension 屬性。 不包含在開頭的 「。"的副檔名。
在 [方案總管] 中,變更兩個項目範本中的檔案名稱DslPackage\ProjectItemTemplates。 這些檔案都遵循這種格式的名稱:
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 定義中,角色名為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 所參考的網域類別
請確定是 Moniker 金鑰是false對於每個網域內的屬性的類別和其基底類別。
在 DSL 總管] 中,展開 Xml 序列化 Behavior\Class Data\< 網域類別 >\Element 資料。
確認是 Moniker 金鑰是false的網域中的每個屬性。
如果網域類別有基底類別,重複該類別中的程序。
設定序列化識別碼 = true的網域類別。
這個屬性可以在下找到 Xml 序列化行為。
若要設定網域類別所限定的索引鍵對 moniker 參考
設定是 Moniker 金鑰 ,則現有的網域類別網域屬性。 屬性的型別必須是string。
在 DSL 總管] 中,展開 Xml 序列化 Behavior\Class Data\< 網域類別 >\Element 資料,然後選取 [網域] 屬性。
在 [屬性] 視窗中,設定是 Moniker 金鑰到true。
-或-
建立新的網域類別使用名為網域類別工具。
這個工具會建立新的類別具有名為名稱的網域屬性。 是項目名稱和是 Moniker 金鑰這個定義域屬性的屬性都會初始化成true。
-或-
建立繼承關聯性從網域類別到另一個類別,包含 moniker 的索引鍵屬性。
避免重複對 Moniker
如果您使用完整的索引鍵對 moniker,很可能在使用者的模型中的兩個項目無法有相同的值,在索引鍵屬性。 比方說,如果您的 DSL 有類別都有屬性名稱的人,使用者可以設定兩個項目的名稱相同。 雖然此模型可能會儲存到檔案,它就不會重新載入正確。
有數種方法,以避免發生這種情況:
設定是項目名稱 = true關鍵的網域] 屬性。 選取 DSL 定義圖表上的 [網域] 屬性,然後在 [屬性] 視窗中設定的值。
當使用者建立新類別的執行個體時,這個值會使 [網域] 屬性,以自動指派不同的值。 預設行為會將數字將類別名稱的結尾。 這並不防止使用者重複出現,以變更名稱,但是使用者並不會將值設定之前先儲存模型時,很有用的情況。
啟用 DSL 的驗證。 DSL 總管] 中選取 Editor\Validation,並設定**使用...**屬性,以true。
沒有自動產生的驗證方法,以檢查語意模糊。 方法是在Load驗證類別。 如此可確保它可能無法重新開啟該檔案會警告使用者。
如需詳細資訊,請參閱 網域指定的語言中的驗證。
Moniker 路徑及辨識符號
合格的索引鍵 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.cs和SerializationHelper.cs。
若要自訂特定類別的序列化
設定是自訂 節點下的該類別中 Xml 序列化行為。
轉換所有的範本、 建置解決方案,並調查結果的編譯錯誤。 每個錯誤附近的註解說明您必須提供哪些程式碼。
若要提供您自己的序列化,供整個模型
- 覆寫 Dsl\GeneratedCode\SerializationHelper.cs 的方法
在 Xml 序列化行為的選項
在 DSL 總管] 中,Xml 序列化行為的節點會包含每個網域類別、 關聯性、 圖形、 連接器及圖表類別的子節點。 在每個節點是屬性和關聯性在該項目中取得資料來源的清單。 關聯的表示,在他們自己的權限和它們的來源類別之下。
下表摘要說明您可以設定在本章節的 DSL 定義的選項。 在每一種情況下,DSL 總管] 中選取一個項目,在 [屬性] 視窗中設定的選項。
Xml 類別資料
這些項目位於 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 型別名稱。 |
備註 |
這個項目相關聯的非正式備忘稿 |
Xml 屬性的資料
[類別] 節點下找到的 Xml 屬性節點。
屬性 |
描述 |
網域屬性 |
Xml 序列化組態資料所套用的屬性。 唯讀。 |
是 Moniker 索引鍵 |
如果為 True,會將屬性做為建立參考這個網域類別的執行個體的對 moniker 的索引鍵。 |
是 Moniker 辨識符號 |
如果為 True,屬性用於建立在對 moniker 的限定詞。 若為 false,且 SerializeId 不是這個網域類別,則為 true,對 moniker 被限定在內嵌的樹狀目錄中的父項目的 moniker。 |
表示 |
如果屬性,屬性已序列化為 xml 屬性。 如果項目,它會序列化為項目。 如果略過],就無法序列化。 |
Xml 名稱 |
用於 xml 屬性或項目代表該屬性的名稱。 預設情況下,這是網域的屬性名稱的小寫版本。 |
備註 |
這個項目相關聯的非正式備忘稿 |
Xml 角色資料
角色資料節點的節點下找到來源類別。
屬性 |
描述 |
---|---|
具有自訂 Moniker |
將此設為 true,如果您想要提供自己的程式碼,來產生及解決周遊此關聯性的 moniker。 如需詳細指示,請建置解決方案,,然後再按兩下 [錯誤訊息。 |
網域關聯性 |
指定要套用這些選項的關係。 唯讀。 |
略過項目 |
如果為 true,則會省略的 XML 節點相對於來源角色從結構描述。 如果來源和目標類別之間有一個以上的關聯性,此角色] 節點會區別屬於兩個關聯的連結。 因此建議您還是要不設定這個選項在此情況下。 |
角色的項目名稱 |
指定 XML 項目是衍生自來源角色的名稱。 預設值是 「 角色 」 屬性名稱。 |
使用完整的表單 |
如果為 true,每個目標項目或 moniker 住 XML 節點代表的關聯性。 這應該設為 true,如果關聯性有它自己網域的內容。 |