Вопрос

Я получил следующее исключение:

System.workflow.runtime.hosting.persistenceException: type 'microsoft.sharepoint.spweb' в сборке 'Microsoft.SharePoint, версия = 12.0.0.0, культура = нейтраль, publicKeyToken = 71E9BCE111E9429C' не помечен как последовательно. -> System.Runtime.Serialization.SerializationException: Type 'Microsoft.SharePoint.spweb' в сборке 'Microsoft.SharePoint, версия = 12.0.0.0, культура = нейтрально, publicKeyToken = 71E9BCE111E9429C

Ошибка пришла отсюда:

public sealed partial class MyWorkflow : StateMachineWorkflowActivity
{
    public SPWorkflowActiviationProperties workflowProperties = new SPWorkflowActivationProperties();
    private SPWeb spWebtemp;

    private SPWeb spWeb
    {
        get { return spWebtemp ?? (spWebtemp = workflowProperties.Web); }
    }

    ...

Я нашел два сообщения в блоге:

Есть одно решение, которое можно найти в этой проблеме: Не иметь сложных объектов -членов в качестве глобальных переменных, но как локальные переменные - т.е. объявить Spweb локально (workflowproperties.web) вместо глобального уровня.

Поэтому мне пришлось бы восстановить SPWEB в каждом методе, который я использую, что я считаю довольно уродливым.

Я также попробовал:

...
[NonSerialized]
private SPWeb spWebtemp;

private SPWeb spWeb
{
    get { return spWebtemp ?? (spWebtemp = workflowProperties.Web); }
}
...

==> Больше нет исключения сериализации!

Есть ли какие -либо негативные последствия при использовании NonSerialized атрибут в этом поле?
Или, другими словами - каковы последствия?

Это было полезно?

Решение

Почему бы тебе просто не сделать:

private SPWeb spWeb
{
    get { return workflowProperties.Web; }
}

ленивая нагрузка объекта SPWEB уже обрабатывается свойством свойств

Другие советы

Похоже, это также также будет работать (атрибут Ondeserialized):

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.ondeserializationattribute.aspx

РЕДАКТИРОВАТЬ

Я не проверил это, но я думаю о чем -то вроде этого:

public sealed partial class MyWorkflow : StateMachineWorkflowActivity
{

public SPWorkflowActiviationProperties workflowProperties = new SPWorkflowActivationProperties();

[NonSerialized()]
private SPWeb spWebtemp;

private SPWeb spWeb
{
    get { return spWebtemp ?? (spWebtemp = workflowProperties.Web); }
}

[OnDeserialized()]
internal void OnDeserializedMethod(StreamingContext context)
{
    spWebTemp = workflowProperties.Web;
}


...

Кроме того, почему бы не инициализировать объект SPWEBTEMP в конструкторе, или это невозможно при рабочих процессах?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top