1

Java アプリケーションで XML シリアライゼーション/デシリアライゼーションを実行するために simple-xml を使用しています。次のようなクラスがあります。

@Root(name="config")
public class Config{
    @Element(name="update_interval")
    private int updateInterval;

    @Element(name="timestamp")
    private long timestamp;

    //...
    //...
}

これで、次のような XML が生成されます。

<config>
    <update_interval>2000</update_interval>
    <timestamp>1234567890</timestamp>
</config>

質問:

実行時に要素名を上書きして、場合によっては XML が次のようになるようにするにはどうすればよいですか?

<config>
    <updt_int>2000</updt_int>
    <ts>1234567890</ts>
</config>

編集:

明確にするために、場合によってのみ要素名をオーバーライドしたいと思います。だから基本的に、

if(condition){
    //Override Element Names
} else {
    //Serialize Normally
}
4

1 に答える 1

1

このコメントのおかげで、この場合、シリアル化を実現する簡単な方法を見つけました。

ただし、そのような XML ドキュメントを逆シリアル化することはできませんでした。これが私の部分的な解決策です:

/*
 * Config.java
 */

@Root(name="config", strict = false)
public class Config {

    @Element(name="timestamp", required = false)
    private long timestamp;

    @Element(name = "update_interval", required = false)
    private int updateInterval;

    public Config() {
    }

    public int getUpdateInterval() {
        return updateInterval;
    }

    public void setUpdateInterval(int updateInterval) {
        this.updateInterval = updateInterval;
    }

    public long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(long timestamp) {
        this.timestamp = timestamp;
    }

    @Override
    public String toString() {
        return "Config{" +
                "timestamp=" + timestamp +
                ", updateInterval=" + updateInterval +
                '}';
    }
}



/*
 * Custom Visitor implementation
 */
public class MyInterceptor implements Visitor {

    private static int sReadCount = 0;
    private static int sWriteCount = 0;
    @Override
    public void read(Type field, NodeMap<InputNode> node) throws Exception {
        /*
         * This is where I need help!
         *
         * 
         * This method is only called once: for the <config> node
         * It is not called for the other nodes since they are not "recognized" 
         * i.e., there are no annotations for the nodes <ts> and <updt_int>
         */

        System.out.println("Read Count : "+ (++sReadCount));
        System.out.println(node.getName());
        System.out.println(node.getNode());

    }

    @Override
    public void write(Type field, NodeMap<OutputNode> node) throws Exception {

        /* 
         * This works like a charm.
         */
        System.out.println("Write Count : "+ (++sWriteCount));
        OutputNode opNode = node.getNode();
        if("timestamp".equals(opNode.getName())){
            opNode.setName("ts");
        }
        if("update_interval".equals(opNode.getName())){
            opNode.setName("updt_int");
        }

    }

}

/*
 *
 */ Main class
public class Bootstrap {

    static final Random RANDOM = new Random();
    public static void main(String [] args){
        Config cfg = new Config();
        cfg.setTimestamp(RANDOM.nextLong());
        cfg.setUpdateInterval(1000);

        Serializer serializer = new Persister(new VisitorStrategy(new MyInterceptor()));

        StringWriter writer = new StringWriter();
        try {
            serializer.write(cfg, writer);
        } catch (Exception e) {
            e.printStackTrace();
        }

        String serialized = writer.toString();
        System.out.println(serialized);

        Config desCfg = null;
        try {
            desCfg = serializer.read(Config.class, serialized);
        } catch (Exception e) {
            e.printStackTrace();
        }

        if(desCfg != null){
            System.out.println(desCfg.toString());
        }
    }
}
于 2012-10-04T13:54:44.610 に答える