【Salesforce】Not Serializable: dom.Document

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です