0

以下のクラスのようにメソッド出力をシリアライズしたいと思います。

@Root
public class Camera {
 public enum Mode {
    CONTINIOUS, TRIGGERED, DEACTIVATED;
 }

@Element
private Mode currMode;
@Element
private int interval;
@Element
private int beforeEvent;
@Element
private int afterEvent;
@Element
private String savePath;

    public Camera(Mode currMode, int interval, int beforeEvent, int afterEvent,
         String savePath) {
     super();
     this.currMode = currMode;
     this.interval = interval;
     this.beforeEvent = beforeEvent;
     this.afterEvent = afterEvent;
     this.savePath = savePath;
 }


@ElementList(entry = "mode", name = "availableModes")
public ArrayList<Mode> getAvailableModes() {
     return new ArrayList<Mode>(Arrays.asList(Mode.values()));
 }

}

このメソッドは、列挙のすべての可能性を List として返します。既定のコンストラクターが設定されていない場合、シリアル化は正常に完了します。

<camera>
  <savePath>/images</savePath>
  <currMode>CONTINIOUS</currMode>
   <beforeEvent>5000</beforeEvent>
   <interval>3000</interval>
   <afterEvent>10000</afterEvent>
   <availableModes>
      <mode>CONTINIOUS</mode>
      <mode>TRIGGERED</mode>
      <mode>DEACTIVATED</mode>
   </availableModes>
</camera>

ただし、逆シリアル化には既定のコンストラクターが必要です。デフォルトのコンストラクターを設定すると、シリアル化および逆シリアル化のプロセス中に次のエラーが発生します。

Default constructor can not accept read only @org.simpleframework.xml.ElementList(data=false, empty=true, entry=mode, inline=false, name=availableModes, required=false, type=void) on method 'availableModes' in class Camera

逆シリアル化中は、注釈付きのメソッドを無視する必要があります。シリアル化プロセス中に考慮され、逆シリアル化プロセス中に無視される要素を定義する可能性はありますか?

4

1 に答える 1

1

リストを設定する何らかの方法があることを確認する必要があります。リストのセッターを追加するか、そのようにコンストラクター注入を使用できます。

 public Camera(
          @Element(name="currMode") Mode currMode, 
          @Element(name="interval") int interval, 
          @Element(name="beforeEvent") int beforeEvent, 
          @Element(name="afterEvent") int afterEvent,
          @Element(name="savePath") String savePath,
          @ElementList(name="availableModes") List<Mode> availableModes) 
       {
         this.currMode = currMode;
         this.interval = interval;
         this.beforeEvent = beforeEvent;
         this.afterEvent = afterEvent;
         this.savePath = savePath;
       }

とにかく、XML シリアライゼーション プロセスは、要素「availableMode」で見つけた値をどこに置くべきかを知る必要があります。

于 2013-09-06T05:45:54.637 に答える