2009-08-13 10 views
0

Je suis à la recherche de l'aide pour atteindre les objectifs suivantsDSL Ajouter élément racine à sérialisation

Le diagramme représente une voiture, les utilisateurs peuvent ajouter le moteur et la couleur

quand je vois le XML, il ressemble à ceci:

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

Ce que je voudrais faire est d'envelopper la voiture à l'intérieur de « véhicule », à savoir

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

Je ne suis pas sûr de la meilleure façon d'y parvenir. Je veux l'explorateur de modèle et le code XML généré à emballer dans « véhicule », mais pour toutes les autres fins que l'utilisateur travaille avec une seule voiture

Info: Visual Studio 2010, C# et SDK DSL pour 2010

+0

Pouvez-vous dire pourquoi vous voulez faire cela? Cela ne correspondra plus à votre modèle de domaine.Peut-être changer pour avoir le diagramme représente un véhicule? –

+0

C'est pour un produit que nous créons - rien à voir avec Cars, mais je pensais que cela aiderait à mieux faire la démonstration. Le modèle de domaine (de la 3ème partie) dicte qu'un véhicule peut avoir plusieurs voitures et il le requiert lorsque son outil importe le code XML généré. Toutefois, dans le DSL que nous créons, nous disons que Vehicle ne disposera jamais que d'une voiture. Il est donc logique de définir le diagramme au niveau de la voiture et d'ajouter uniquement l'élément Vechicle au moment de la sérialisation. Est-ce que ça a du sens? –

Répondre

0

J'ai résolu ce par ce qui suit. Je suis à double dérivez la classe de voitures et dans le sérialiseur Car je fais ceci:

L'écriture des éléments supplémentaires:

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

Pour pouvoir lire ce retour dans je redéfinissant la méthode loadModel Car dans le SerializationHelper et où le lecteur est en train de lire les éléments jusqu'à ce que j'arrive à 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

Je voudrais essayer deux approches différentes:


1er: DSL override paquet classe dOCdata Dans le fichier de DocData.cs et la méthode de remplacement

protected override void OnDocumentSaved(System.EventArgs e) 

puis je créerais l'emballage

ensuite je voudrais passer outre à DocData.cs

protected override void OnDocumentLoading(System.EventArgs e) 

et avant d'appeler la méthode de base base.OnDocumentLoading(e); je voudrais supprimer le fichier.


2: Sous DSL Explorer, allez au comportement XML sérialisation et définissez classe Domaine Car "est-mesure = true".

Cette solution n'est pas simple mais ce n'est pas aussi compliqué qu'il n'y parait en premier lieu. Vous devez définir chaque méthode, mais pour chaque méthode personnalisée, vous pouvez appeler une méthode générée par DSL appelée "DefaulMethod" qui a le comportement par défaut du sérialiseur DSL.


Je suis actuellement en utilisant VS 2005, de sorte que certaines choses auraient pu changer ...

+0

J'ai regardé votre premier message mais tout ce que j'ai pu voir était SerializedModel (string) mais c'était seulement un getter. Je ne pouvais pas outrepasser les méthodes non plus. Je suis toujours perplexe –

+0

Hej! J'étais sur les postes vacants alors je n'ai pas eu la chance de répondre. Qu'entendez-vous par "1er message"? Quelle approche avez-vous essayé? –

Questions connexes