WorkflowMarkupSerializer не сохраняет позиции в рабочем процессе конечного автомата - PullRequest
0 голосов
/ 09 апреля 2009

Я использую WorkflowMarkupSerializer для сохранения рабочего процесса машины состояний - он сохраняет состояния в порядке, но не сохраняет их позиции. Код для написания рабочего процесса находится здесь:

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

Код для чтения рабочего процесса:

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

Ответы [ 5 ]

1 голос
/ 06 апреля 2010

Откройте Панель управления -> «Язык и региональные стандарты» и установите разделитель списка на «,» (запятая) и сериализатор рабочего процесса будет использовать ',' (запятую) в качестве разделителя для координат X, Y для структуры SizeF

затем выберите ';' и сериализатор рабочего процесса будет использовать ';' (точка с запятой) в качестве разделителя.

Это действительно глупо, что сериализатор использует региональные настройки для сериализации разметки.

0 голосов
/ 11 апреля 2009

Обратите внимание, что существует ошибка в сериализации или десериализации созданного XML (названа в примере с расширением .layout.)

Создает следующий xml в качестве первой строки файла:

<?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">

При чтении этого значения атрибут size вызывает исключение. Я удалил Size = "519, 587" из файла, и рабочий процесс загружен обратно правильно. Прямо сейчас я пишу файл, открываю его и удаляю размер, затем закрываю его. Мне нужно подумать о более элегантном решении, но по крайней мере сейчас я сохраняю и восстанавливаю рабочий процесс конечного автомата.

0 голосов
/ 09 апреля 2009

Положение всех состояний хранится в отдельном файле. Вам нужно будет перетащить его с разметкой самого рабочего процесса. К счастью, это всего лишь XML, так что вы можете повторно использовать большую часть кода, который у вас есть. Если память служит, я считаю, что это просто NameOfYourWorkflow.layout.

Я согласен с x0n - дизайнер очень плох в Visual Studio.

0 голосов
/ 10 апреля 2009

ОК, этот урок дает хорошую информацию о том, как это сделать - хотя до сих пор я могу только сохранить макет, но не смог правильно используйте макет. Информация, о которой идет речь, примерно на 2/3 ниже (или просто выполните поиск .layout)

(Как закрыть свой вопрос?)

0 голосов
/ 09 апреля 2009

Ха, даже дизайнер рабочих процессов, размещенный в Visual Studio 2008, случайным образом теряет позиции состояний. Это говорит мне, что это, вероятно, не простая задача, и это информация, внешняя по отношению к видам деятельности, которые ее составляют. Я бы больше копался в хосте для информации; если я что-то найду, я отправлю обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...