Исключение из-за сложного объекта - PullRequest
0 голосов
/ 15 июня 2011

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

System.Workflow.Runtime.Hosting.PersistenceException: введите «Microsoft.SharePoint.SPWeb» в сборке «Microsoft.SharePoint, версия = 12.0.0.0, культура = нейтральная, PublicKeyToken = 71e9bce111e9429c» не помечена как сериализуемая. -> System.Runtime.Serialization.SerializationException: введите «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 в этом поле?
Или другими словами - каковы последствия?

Ответы [ 2 ]

1 голос
/ 19 декабря 2011

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

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

[EDIT]

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

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 в конструкторе, или это невозможно с рабочими процессами?

1 голос
/ 15 июня 2011

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

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

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

...