自定义文件存储和 XML 序列化
当用户保存时实例或 模型中, Visual Studio的域特定语言 (DSL) (dsl), XML 文件创建或更新。文件可以重新加载重新创建该模型存储区中
您可以通过调整设置自定义序列化模式在 DSL 资源管理器中 XML 序列化行为 下。具有节点在每个域类、属性和关系的 XML 序列化行为 下。关系位于其源类下。还具有节点具有形状、连接和关系图类相对应。
您还可以编写更高级的自定义项的程序代码。
说明 |
---|
如果要保存模型以特定格式,但是,您不需要重新加载它从该窗体,请考虑使用文本模板从模型生成输出,而不是自定义序列化模式。有关更多信息,请参见 从域特定语言生成代码。 |
模型和关系图文件
每个模型在两个文件通常是保存:
模型文件的名称类似 Model1.mydsl。它存储模型元素和关系及其特性。文件扩展名 (如 .mydsl 取决于 编辑 节点的 FileExtension 属性在 DSL 定义的。
关系图文件的名称类似 Model1.mydsl.diagram。它存储形状、连接及其位置、颜色、线条粗细和关系图的外观的其他详细信息。如果用户删除 .diagram 文件,在设计的重要信息不会丢失。关系图的格式只丢失。打开后模型文件,默认设置形状,并绑定将创建。
更改 DSL 的文件扩展名
打开 DSL 定义。在 DSL Explorer 中,单击编辑节点。
在 " 属性 " 窗口中,编辑 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 节点。
每个的目标末尾引用关系序列化为 标记,输入对目标元素。
例如,在 person 节点下,可能有 children 关系。此节点包含标记例如:
<personMoniker name="/f817b728-e920-458e-bb99-98edc469d78f/Elizabeth I" />
了解的标记
标记来表示该模型的不同部分和关系图文件之间的交叉引用。它们还用于 .diagram 文件指模型文件的节点。具有标记的两种形式:
ID 标记 引用目标元素的 GUID。例如:
<personShapeMoniker Id="f79734c0-3da1-4d72-9514-848fa9e75157" />
限定键标记 通过调用标记密钥对指定的字段的特性的值标识目标元素。目标元素的标记由其在嵌入关系树中的父元素标记前缀。
下面的示例从具有名为 Album 的域类,对名为 Song 的域类的一个嵌入关系的 DSL 采用:
<albumMoniker title="/My Favorites/Jazz after Teatime" /> <songMoniker title="/My Favorites/Jazz after Teatime/Hot tea" />
将使用限定键标记,如果目标类使用选项 是 TAB 键 设置为 XML 序列化行为的 true 的一个字段的特性。在此示例中,此选项可以在域名为 “标题”字段的特性设置类别 “相册”和 “一”。
限定键戳比 ID 标记是容易阅读。如果您打算方将读取模型文件的 XML,请考虑使用限定键标记。但是,设置多个元素具有相同标记键用户是可能的。重复键可能会导致文件不正确重新加载。因此,因此,如果您定义使用限定键标记,引用的域类,应考虑阻止用户方式保存有重复标记的文件。
设置 ID 标记中引用的域类
确保 是 TAB 键 为每个字段的特性的 false 在类及其基类。
在 DSL 资源管理器中,展开 XML 序列化行为 \Class Data \the domain class\Element Data。
验证 是 TAB 键 为每个字段的特性的 false 。
如果字段类具有基类,请重复该类的过程。
设置字段类的 序列化 ID = true 。
此特性在 XML 序列化行为下。
设置限定键标记中引用的域类
将现有字段类的字段的特性的 是 TAB 键 。属性的类型必须是 string。
在 DSL 资源管理器中,展开 XML 序列化行为 \Class Data \the domain class\Element Data,然后选择字段的特性。
在 " 属性 " 窗口中,将 是 TAB 键 到 true。
- 或 -
使用 命名的 Domain Class 工具,创建新的域类。
此工具创建具有称为 Name " 的字段属性的新类。此字段的特性 是元素名称 和 是 TAB 键 属性初始化为 true。
- 或 -
创建从域类的继承关系在一个标记键属性的其他类。
避免重复标记。
如果使用限定键标记,可能会在用户模型的两个元素可以在键属性的值相同。例如, DSL,如果有一个属性名称的类人员,用户可以将两个组件的名称相同。尽管该模型可以保存到文件时,将不会正确重新加载。
具有帮助避免此情况的几种方法:
设置键字段的特性的 是元素名称 = true 。选择在 DSL 定义关系图的字段的特性然后在 " 属性 " 窗口中设置值。
当用户创建类的新实例,此值原因自动赋值的字段的特性不同的值。默认行为将数字到类名的结尾。这不会阻止用户更改名称到副本,但是,它在用例有助于,当用户在不保存模型之前将值。
启用 DSL 的验证。在 DSL 资源管理器中,选择编辑器 \Validation,并将 使用… 属性设置为 true。
需要检查多义性的自动生成的验证方法。方法在 Load 验证类别。这样可确保重新打开文件的用户将警告可能是不可能的。
有关更多信息,请参见 域特定语言中的验证。
标记路径和限定符
一个限定键标记进行标记键关闭和前缀与其该嵌入的树中的父标记。例如,因此,如果相册的标记是:
<albumMoniker title="/My Favorites/Jazz after Teatime" />
然后之一在该相册的几个可能包括:
<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 。这将使它用作限定符,,无需使用父的标记。例如,因此,如果设置 是标记限定符 和 是 TAB 键 相册类的标题字段的特性的,模型的名称或标识符不使用标记为相册和的所有子项:
<albumMoniker name="Jazz after Teatime" />
<songMoniker title="/Jazz after Teatime/Hot tea" />
自定义 XML 的结构
若要使以下自定义,展开在 DSL 资源管理器中 XML 序列化行为 节点。在域类下,展开节点以查看数据元素是源此类特性和关系的列表。选择一个关系并调整其在 " 属性 " 窗口的选项卡。
设置为 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 Explorer 的一个元素,并在 " 属性 " 窗口中设置选项。
XML 类数据
这些元素在 XML 序列化行为 \Class Data下的 DSL 资源管理器中。
属性 |
说明 |
具有自定义组件的架构 |
如果为 true,则指示字段类具有自定义组件的架构 |
是自定义的 |
请将此为 true,如果要编写拥有序列化,和反序列化了该字段类代码。 生成解决方案并调查错误查看详细说明。 |
域类 |
此类数据节点应用的域类。只读。 |
元素名称 |
XML 节点名称对于此类的元素。默认值为字段类名的一个小写版本。 |
标记属性名称 |
用于标记元素的属性的名称包含引用。如果或 ID 使用空、键属性的名称。 在此示例中,它是 “name”: <personMoniker name="/Mike Nash"/> |
标记元素名称 |
用于引用此类元素的标记的 XML 元素的名称。 默认值为使用 “标记”作为后缀的类名的一个小写版本。例如 personMoniker。 |
标记类型名称 |
为标记生成的 xsd 类型的名称对该类的元素。XSD 在 Dsl\Generated Code\*Schema.xsd |
序列化 ID |
如果为 true,元素 GUID 在文件中。这必须满足的; 如果没有标记为 是 TAB 键 ,并且 DSL 定义对该类的关系的属性。 |
类型名称 |
在从指定的字段类的 xsd 生成的 XML 类型的名称。 |
注释 |
非正式的说明与此元素关联 |
XML 属性数据
XML 属性节点位于类节点下。
属性 |
说明 |
字段的特性 |
XML 序列化配置数据应用特性。只读。 |
是 TAB 键 |
如果为 true,属性用作键用于创建引用此字段实例类别的标记。 |
是标记限定符 |
如果为 true,属性用于创建限定符使用在标记。如果错误,并且,如果 SerializeId 不适用于此字段类,标记由父元素的标记该嵌入的树中的限定。 |
表示形式 |
如果属性,该属性序列化为 XML 属性;如果组件,则序列化为元素;如果请忽略,没有序列化它。 |
XML 名称 |
用于 XML 特性或元素的名称表示特性。默认情况下,这是字段特性名称为的小写版本。 |
注释 |
非正式的说明与此元素关联 |
角色 XML 数据
角色数据节点位于源类节点下。
属性 |
说明 |
---|---|
具有自定义标记 |
请将此为 true,如果您希望提供遍历此关系生成和解决的标记自己的代码。 有关详细说明,请生成解决方案,然后双击错误消息。 |
域关系 |
指定这些选项适用的关系。只读。 |
省略元素 |
如果为 true,对应于源角色的 XML 节点从该架构被忽略。 如果存在多个源和目标类之间的关系,此角色节点区分属于两个关系的链接之间。因此建议您在未设置此选项。 |
角色元素名称 |
指定从源角色派生 XML 元素的名称。默认值为角色属性名称。 |
使用完整的窗体 |
如果为 true,每个目标元素或标记在表示该关系的 XML 节点中。,如果该关系都有自己的字段的特性,应该设置为 true。 |