自定义文件存储和 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。 |