2009-08-13 68 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