Рабочий процесс serializationException из -за сложного объекта
Вопрос
Я получил следующее исключение:
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); }
}
...
Я нашел два сообщения в блоге:
- ... не отмечается как сериализуемый
- Проблема сериализации с Windows Workflow Foundation и SharePoint Workflow
Есть одно решение, которое можно найти в этой проблеме: Не иметь сложных объектов -членов в качестве глобальных переменных, но как локальные переменные - т.е. объявить 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 в конструкторе, или это невозможно при рабочих процессах?