2009-08-13 46 views
0

我寻求帮助,以实现以下DSL添加根元素序列化

该图表示了一辆车,用户可以添加引擎和彩色

当我查看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

+0

你能说你为什么要这么做?它将不再与您的域模型相匹配。也许改变,让图表代表车辆? – 2009-08-13 10:25:58

+0

这是一款我们正在创造的产品 - 与Cars无关,但我认为这有助于更好地展示。 (第三方)域模型规定车辆可以有多个Cars,并且在他们的工具导入生成的XML时需要这个。 然而,在DSL中,我们创建的是我们所说的车辆将只有1辆车,因此我们将车辆图设置为汽车级,并且仅在序列化时或更好的地方添加Vechicle元素才有意义。这有意义吗? – 2009-08-13 10:50:46

回答

0

我已经通过以下解决了这个。我双推导汽车类,并在车载串行我这样做:

编写额外的元素:

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(); 
    } 
} 

为了能够阅读这回我是覆盖在该汽车LoadModel方法SerializationHelper以及读者在哪里阅读元素,直到我到达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) 
{ 

....

0

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


1:超越DSL套餐类DocData 在DocData.cs文件并覆盖方法

protected override void OnDocumentSaved(System.EventArgs e) 

,然后我会创建包装

后来我在DocData.cs

protected override void OnDocumentLoading(System.EventArgs e) 

,并调用基方法base.OnDocumentLoading(e);我会从文件中删除前覆盖。


第二:在DSL资源管理器去XML序列化行为,并设置汽车领域一流“是自定义=真”。

这个解决方案并不简单,但并不像第一个那样复杂。您必须定义每一种方法,但是对于每种自定义方法,您可以调用一个名为“DefaulMethod”的DSL生成方法,该方法具有默认的DSL串行器行为。


我目前使用VS 2005,所以有些事情可能会改变......

+0

我看了一下你的第一条消息,但我只能看到SerializedModel(字符串),但它只是一个getter。我也无法重写任何方法。我仍然难倒 – 2009-09-01 19:32:37

+0

Hej!我在空位上,所以我没有机会回答。 “1st message”是什么意思?你试过什么方法? – 2009-09-23 09:04:28