Полная Сериализация в Worfklow 4.0 - PullRequest
0 голосов
/ 12 января 2012

Я пытаюсь сериализовать рабочий процесс (используя рабочий процесс C # 4.0), чтобы получить полный рабочий процесс XAML и ударить по стене.

У меня есть активность (myActivity), которую я создал. Содержимое файла xaml, описывающего это действие:

    <Activity mc:Ignorable="sap" x:Class="atest.MySuite" >
  <Sequence sap:VirtualizedContainerService.HintSize="222,501">
    <sap:WorkflowViewStateService.ViewState>
      <scg3:Dictionary x:TypeArguments="x:String, x:Object">
        <x:Boolean x:Key="IsExpanded">True</x:Boolean>
      </scg3:Dictionary>
    </sap:WorkflowViewStateService.ViewState>
    <Sequence DisplayName="First Sequence" sap:VirtualizedContainerService.HintSize="200,99">
      <sap:WorkflowViewStateService.ViewState>
        <scg3:Dictionary x:TypeArguments="x:String, x:Object">
          <x:Boolean x:Key="IsExpanded">True</x:Boolean>
        </scg3:Dictionary>
      </sap:WorkflowViewStateService.ViewState>
    </Sequence>
    <Sequence DisplayName="Second Sequence" sap:VirtualizedContainerService.HintSize="200,99">
      <sap:WorkflowViewStateService.ViewState>
        <scg3:Dictionary x:TypeArguments="x:String, x:Object">
          <x:Boolean x:Key="IsExpanded">True</x:Boolean>
        </scg3:Dictionary>
      </sap:WorkflowViewStateService.ViewState>
    </Sequence>
    <Sequence DisplayName="Third Sequence" sap:VirtualizedContainerService.HintSize="200,99">
      <sap:WorkflowViewStateService.ViewState>
        <scg3:Dictionary x:TypeArguments="x:String, x:Object">
          <x:Boolean x:Key="IsExpanded">True</x:Boolean>
        </scg3:Dictionary>
      </sap:WorkflowViewStateService.ViewState>
    </Sequence>
  </Sequence>
</Activity>

Обратите внимание, что подпоследовательности отображаются в XAML.

При сериализации этого действия я использую код, найденный в MSDN:

using (var sw = new StreamWriter(somePath))
{
    sw.Write(a.Log.ToString());
    StringBuilder sb = new StringBuilder();
    StringWriter tw = new StringWriter(sb);
    XamlWriter xw = ActivityXamlServices.CreateBuilderWriter(new XamlXmlWriter(tw, new XamlSchemaContext()));

    XamlServices.Save(xw, myActivity);
    string serializedActivity = sb.ToString();
}

Но строка, которая выходит на другом конце, просто:

<?xml version="1.0" encoding="utf-16"?><MySuite xmlns="clr-namespace:atest;assembly=Wtf.Automation.atest" xmlns:sap="http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation" />

Я изучал MSDN и stackoverflow, но не нашел способа получить полный XAML пользовательского действия (с учетом экземпляра этого действия), как я описал в моем файле xaml, а не только в этой усеченной версии.

Кто-нибудь знает, есть ли способ? Примеры кода и / или указатели будут с благодарностью.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 января 2012

Сериализация:

public static string ActivityToXaml(Activity activity)
{
    StringBuilder xaml = new StringBuilder();

    using (XmlWriter xmlWriter = XmlWriter.Create(xaml, new XmlWriterSettings { Indent = true, OmitXmlDeclaration = false, }))
    using (XamlWriter xamlWriter = new XamlXmlWriter(xmlWriter, new XamlSchemaContext()))
    using (XamlWriter xamlServicesWriter = ActivityXamlServices.CreateBuilderWriter(xamlWriter))
    {
        XamlServices.Save(xamlServicesWriter, new ActivityBuilder { Implementation = activity });
    }

    return xaml.ToString(); 
}

Deserialize:

public static Activity ActivityFromXaml(string activityXaml) 
{
    using (var reader = new StringReader(activityXaml))
    {
        return ActivityXamlServices.Load(reader);
    }
}
0 голосов
/ 12 января 2012

Я считаю, что ваша проблема в том, что ActivityXamlServices.CreateBuilderWriter работает с ActivityBuilder экземплярами. Попробуйте

XamlServices.Save(xw, new ActivityBuilder { Implementation = myActivity });
...