【问题标题】:DSL Add Root Element to SerializationDSL 将根元素添加到序列化
【发布时间】:2009-08-13 10:23:29
【问题描述】:

我正在寻求帮助以实现以下目标

图表代表汽车,用户可以添加引擎和颜色

当我查看 XML 时,它看起来像这样:

<Car>
  <Engine>BigEngine</Engine>
  <Colour>Pink</Colour>
</Car>

我想做的是将汽车包裹在“车辆”内,即

<Vehicle>
  <Car>
    <Engine>BigEngine</Engine>
    <Colour>Pink</Colour>
  </Car>
</Vehicle>

我不确定实现这一目标的最佳方法。我希望将模型浏览器和生成的 XML 包装在“车辆”中,但对于所有其他意图和目的,用户仅使用汽车

信息:Visual Studio 2010、C# 和 DSL SDK 2010

【问题讨论】:

  • 你能说出你为什么要这样做吗?它不再与您的域模型匹配。也许更改为让图表代表车辆?
  • 这是针对我们正在创造的产品 - 与 Cars 无关,但我认为它有助于更​​好地展示。 (第 3 方的)域模型规定车辆可以有多个汽车,并且在他们的工具导入生成的 XML 时需要这样做。然而,在我们正在创建的 DSL 中,我们说因为 Vehicle 将永远只有 1 辆 Car,所以我们将图表设置在 Car 级别并仅在序列化时或更好的地方添加 Vechicle 元素是有意义的。这有意义吗?

标签: dsl dsl-tools


【解决方案1】:

我会尝试两种不同的方法:


1st: 覆盖 DSL 包类 DocData 在 DocData.cs 文件中并覆盖方法

protected override void OnDocumentSaved(System.EventArgs e)

然后我会创建包装器

之后我会在 DocData.cs 中覆盖

protected override void OnDocumentLoading(System.EventArgs e)

在调用基本方法base.OnDocumentLoading(e);之前,我会从文件中删除。


第二个: 在 DSL Explorer 下,进入 XML Serialization Behavior 并设置 Car Domain Class “Is Custom = true”。

这个解决方案并不简单,但并不像最初看起来那么复杂。您必须定义每一个方法,但对于每个自定义方法,您可以调用名为“DefaulMethod”的 DSL 生成方法,该方法具有默认的 DSL 序列化程序行为。


我目前使用的是 VS 2005,所以有些东西可能已经改变了...

【讨论】:

  • 我查看了您的第一条消息,但我只能看到 SerializedModel(字符串),但它只是一个吸气剂。我也无法覆盖任何方法。我还是难过
  • 嘿!我有空缺,所以我没有机会回答。 “第一条消息”是什么意思?您尝试了哪种方法?
【解决方案2】:

我已经通过以下方式解决了这个问题。我正在双重派生 Car 类,并且在 Car 序列化程序中我正在这样做:

编写额外的元素:

  public partial class CarSerializer : CarSerializerBase
{
    public override void Write(SerializationContext serializationContext, ModelElement element, XmlWriter writer, RootElementSettings rootElementSettings)
    {
        // Adds the Model and LobSystem root elements to match that required by the SharePoint BCS
        writer.WriteStartElement("Garage");
        writer.WriteStartElement("Cars");
        base.Write(serializationContext, element, writer, rootElementSettings);
        writer.WriteEndElement();
        writer.WriteEndElement();
    }
}

为了能够读回此内容,我将覆盖 SerializationHelper 中的 Car LoadModel 方法,并在它获取读者的位置我正在阅读元素,直到我到达 Car。

....

XmlReader reader = XmlReader.Create(fileStream, settings);
reader.MoveToContent();
while (!reader.EOF && !reader.Name.Equals("Car"))
{
   reader.Read();
}

reader = reader.ReadSubtree();

//    using (global::System.Xml.XmlReader reader = global::System.Xml.XmlReader.Create(fileStream, settings))
using (reader)
{

....

【讨论】:

    猜你喜欢
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2018-08-31
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多