【Salesforce】Not Serializable: dom.Document
あまり多くはないのですが、SalesforceでXMLを使用する機会があったりします。
SalesforceにはDom.Documentというクラスが用意されており、XML関連の修正は大体こいつにお任せ状態です。
しかし、使い方を誤るとエラーが発生します。
しかし、使い方を誤るとエラーが発生します。
Not Serializable: dom.Document
今回はDom.DocumentクラスのインスタンスをVisualforce側に渡した際に発生しました。
シリアライズできないオブジェクトをこのように使用するとエラーとなるようですね。
public with sharing class DomDocumentController { public Dom.Document domDocument{get;set;} /** コンストラクタ */ public DomDocumentController (){ this.domDocument= new Dom.Document(); } }
Visualforce側のinputTextへを使用しています。
<apex:page controller="DomDocumentController" > <apex:form> <apex:inputText value="{!domDocument}" /> </apex:form> </apex:page>
どうやら、transientを付けて一時的な変数とする必要があるようです。
しかし、単純にtransientを付与するだけではVisualforce側で値の編集をすることが出来ないため、文字列として渡してみました。
public with sharing class DomDocumentController { transient private Dom.Document domDocument; /** コンストラクタ */ public DomDocumentController (){ this.domDocument= new Dom.Document(); } /** 文字列として表示 */ public String getXMLString(){ return this.domDocument.toXmlString(); } public void setXMLString(String xml){ this.domDocument= new Dom.Document(); this.domDocument.load(xml); } }
Visualforce側では文字列を使用しています。
もちろん、クラスの内部変数にDom.Documentを使用せず、文字列型を持っていてもOKです。
その場合はその都度loadする必要が出てきます。
ちなみに、海外の方だとバッチ処理にDom.Documentを使用して発生したりしたようです。
https://salesforce.stackexchange.com/questions/129954/how-do-i-maintain-state-for-dom-document-type-variables-between-start-and-execut
こちらではexecute側でDom.Documentを使用しろって書いてありますね。
No comments.