【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.