2009-04-09 3 views
0

J'utilise WorkflowMarkupSerializer pour enregistrer un workflow de statemachine - il enregistre les états OK, mais ne conserve pas leurs positions. Le code pour écrire le flux de travail est ici:WorkflowMarkupSerializer ne conserve pas les positions dans un flux de travail de machine d'état

 using (XmlWriter xmlWriter = XmlWriter.Create(fileName)) 
     { 
      WorkflowMarkupSerializer markupSerializer 
       = new WorkflowMarkupSerializer(); 
      markupSerializer.Serialize(xmlWriter, workflow); 
     } 

Le code pour lire le flux de travail est:

  DesignerSerializationManager dsm 
      = new DesignerSerializationManager(); 
     using (dsm.CreateSession()) 
     { 
      using (XmlReader xmlReader 
       = XmlReader.Create(fileName)) 
      { 
       //deserialize the workflow from the XmlReader 
       WorkflowMarkupSerializer markupSerializer 
        = new WorkflowMarkupSerializer(); 
       workflow = markupSerializer.Deserialize(
        dsm, xmlReader) as Activity; 

       if (dsm.Errors.Count > 0) 
       { 
        WorkflowMarkupSerializationException error 
         = dsm.Errors[0] 
          as WorkflowMarkupSerializationException; 
        throw error; 
       } 
      } 
     } 

Répondre

0

OK, this tutorial donne de bonnes informations sur la façon de le faire - bien que jusqu'à présent, je ne suis en mesure de sauver la mise en page, je ne l'ai pas pu correctement utiliser la mise en page. Les informations en question est d'environ 2/3rds vers le bas (ou tout simplement faire une recherche pour .layout)

(Comment peut-on fermer sa propre question?)

0

Hah, même le concepteur de workflow hébergé dans Visual Studio 2008 perd les positions des Etats au hasard. Cela me dit que ce n'est probablement pas une tâche facile, et que ce sont des informations externes aux Activités qui le composent. Je creuserais plus autour de l'hôte pour l'information; si je trouve quelque chose, je posterai.

0

La position de tous les états est conservée dans un fichier séparé. Vous devrez le faire glisser avec le balisage du flux de travail lui-même. Heureusement, il ne s'agit que de XML, et vous pourrez peut-être réutiliser la majeure partie du code que vous avez là-bas. Si ma mémoire est bonne, je crois que c'est simplement NameOfYourWorkflow.layout.

Je suis d'accord avec x0n - le concepteur est vraiment mauvais dans Visual Studio.

0

Notez qu'il ya un bogue dans l'une ou l'autre sérialisation ou deserialize du XML créé (nommé dans l'exemple avec une extension de .layout.)

Il produit le code XML suivant la première ligne du fichier:

<?xml version="1.0" encoding="utf-8"?><StateMachineWorkflowDesigner xmlns:ns0="clr-namespace:System.Drawing;Assembly=System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Name="New" Location="30, 30" Size="519, 587" AutoSizeMargin="16, 24" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow"> 

en lisant ce retour dans la taille att ribute provoque une exception. J'ai supprimé Size = "519, 587" du fichier et le workflow est correctement chargé. En ce moment, j'écris le fichier, l'ouvre et enlève la taille, puis ferme-le. Je dois penser à une solution plus élégante, mais au moins je suis en train d'enregistrer et de restaurer un workflow de machine d'état.

1

Panneau de configuration ouvert -> « Options régionales et linguistiques » et le séparateur de liste figurant à « » (virgule) et flux de travail sérialiseur utilisera « » (virgule) comme séparateur pour coordonnées X, Y pour struct SizeF

puis sélectionnez ';' et le sérialiseur de workflow utilisera ';' (point-virgule) comme séparateur.

C'est vraiment stupide que le sérialiseur utilise le paramètre régional pour le balisage de sérialisation.

Questions connexes