Исключение из-за сложного объекта
Я получил следующее исключение:
System.Workflow.Runtime.Hosting.PersistenceException: введите "Microsoft.SharePoint.SPWeb" в сборке "Microsoft.SharePoint, версия =12.0.0.0, Culture= нейтральный, PublicKeyToken=71e9bce111e9429c" не помечен как сериализуемый. -> System.Runtime.Serialization.SerializationException: введите "Microsoft.SharePoint.SPWeb" в сборке "Microsoft.SharePoint, версия =12.0.0.0, Culture= нейтральный, 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
атрибут на этом поле?
Или другими словами - каковы последствия?
2 ответа
Почему бы вам просто не сделать:
private SPWeb spWeb
{
get { return workflowProperties.Web; }
}
ленивая загрузка объекта spweb уже обрабатывается свойством properties
Похоже, это также будет работать (атрибут OnDeserialized):
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.ondeserializedattribute.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 в конструкторе, или это невозможно с рабочими процессами?