複雑なオブジェクトによるワークフローシリアル化エクセプト
質問
次の例外がありました。
System.workflow.runtime.hosting.persistenceException:タイプ 'microsoft.sharepoint.spweb' in Assembly 'Microsoft.SharePoint、バージョン= 12.0.0.0、Culture = Neutral、PublicKeyToken = 71E9BCE1111E9429C'は平等にマークされていません。 - > System.Runtime.Serialization.SerializationException:タイプ 'Microsoft.sharepoint.spweb' In Assembly 'Microsoft.SharePoint、バージョン、version = 12.0.0.0、Culture = Neutral、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); }
}
...
私が見つけた2つのブログ投稿があります:
この問題には1つの解決策があります。 グローバル変数として複雑なメンバーオブジェクトを持っていません, 、しかし、ローカル変数として - つまり、グローバルレベルではなく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オブジェクトの怠zyな負荷は、プロパティプロパティによって既に処理されています
他のヒント
これも機能するように見えます(以前の属性属性):
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オブジェクトを初期化してみませんか、それともワークフローでは不可能ですか?