看看XStream註解

前文展示了使用別名更改XML展示內容,在這一節,可以使用註解更簡單的更改XML展示。


(1)最簡單的註解示例


1. 輸出響應消息

package com.favccxx.favsoft.pojo;
public class ResponseMessage {
    private int messageType;
    private String messageContent;
    public ResponseMessage(int messageType, String messageContent){
        this.messageType = messageType;
        this.messageContent = messageContent;
    }
    public int getMessageType() {
        return messageType;
    }
    public void setMessageType(int messageType) {
        this.messageType = messageType;
    }
    public String getMessageContent() {
        return messageContent;
    }
    public void setMessageContent(String messageContent) {
        this.messageContent = messageContent;
    }
}


2. 開始測試

package com.favccxx.favsoft.main;
import com.favccxx.favsoft.pojo.ResponseMessage;
import com.thoughtworks.xstream.XStream;
public class MainAnnotations {
    public static void main(String[] args) {
        XStream stream = new XStream();
        ResponseMessage msg = new ResponseMessage(200, "成功");
        System.out.println(stream.toXML(msg));
    }
}


3. 測試結果

<com.favccxx.favsoft.pojo.ResponseMessage>
  <messageType>200</messageType>
  <messageContent>成功</messageContent>
</com.favccxx.favsoft.pojo.ResponseMessage>


4. 使用註解後的輸出內容

package com.favccxx.favsoft.pojo;
import com.thoughtworks.xstream.annotations.XStreamAlias;
@XStreamAlias("message")
public class ResponseMessage {
    @XStreamAlias("type")
    private int messageType;
    @XStreamAlias("content")
    private String messageContent;
    public ResponseMessage(int messageType, String messageContent){
        this.messageType = messageType;
        this.messageContent = messageContent;
    }
    public int getMessageType() {
        return messageType;
    }
    public void setMessageType(int messageType) {
        this.messageType = messageType;
    }
    public String getMessageContent() {
        return messageContent;
    }
    public void setMessageContent(String messageContent) {
        this.messageContent = messageContent;
    }
}


xstream.processAnnotations(ResponseMessage.class);


<message>
  <type>200</type>
  <content>成功</content>
</message>


(2)使用集合註解


2.1 響應消息對象

package com.favccxx.favsoft.pojo;
import java.util.Arrays;
import java.util.List;
import com.thoughtworks.xstream.annotations.XStreamAlias;
@XStreamAlias("message")
public class ResponseMessage {
    @XStreamAlias("type")
    private int messageType;
    @XStreamAlias("content")
    private List<String> messageContent;
    public ResponseMessage(int messageType, String ... messageContent){
        this.messageType = messageType;
        this.messageContent = Arrays.asList(messageContent);
    }
    public int getMessageType() {
        return messageType;
    }
    public void setMessageType(int messageType) {
        this.messageType = messageType;
    }
    public List<String> getMessageContent() {
        return messageContent;
    }
    public void setMessageContent(List<String> messageContent) {
        this.messageContent = messageContent;
    }
}


2.2 開始測試

package com.favccxx.favsoft.main;
import com.favccxx.favsoft.pojo.ResponseMessage;
import com.thoughtworks.xstream.XStream;
public class MainAnnotations {
    public static void main(String[] args) {
        XStream xstream = new XStream();
        xstream.processAnnotations(ResponseMessage.class);
        ResponseMessage msg = new ResponseMessage(28, "終於爬上來了!","我忘帶鑰匙了!!!");
        System.out.println(xstream.toXML(msg));
    }
}


2.3 輸出結果

<message>
  <type>28</type>
  <content class="java.util.Arrays$ArrayList">
    <a class="string-array">
      <string>終於爬上來了!</string>
      <string>我忘帶鑰匙了!!!</string>
    </a>
  </content>
</message>


2.4使用@XStreamImplicit註解將集合標記爲隱式集合

package com.favccxx.favsoft.pojo;
import java.util.Arrays;
import java.util.List;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
@XStreamAlias("message")
public class ResponseMessage {
    @XStreamAlias("type")
    private int messageType;
    @XStreamImplicit
    private List<String> messageContent;
    public ResponseMessage(int messageType, String... messageContent) {
        this.messageType = messageType;
        this.messageContent = Arrays.asList(messageContent);
    }
    public int getMessageType() {
        return messageType;
    }
    public void setMessageType(int messageType) {
        this.messageType = messageType;
    }
    public List<String> getMessageContent() {
        return messageContent;
    }
    public void setMessageContent(List<String> messageContent) {
        this.messageContent = messageContent;
    }
}


2.5 輸出結果

<message>
  <type>28</type>
  <string>終於爬上來了!</string>
  <string>我忘帶鑰匙了!!!</string>
</message>


2.6 在原有註解對象上,對字段進行別名

package com.favccxx.favsoft.pojo;
import java.util.Arrays;
import java.util.List;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
@XStreamAlias("message")
public class ResponseMessage {
    @XStreamAlias("type")
    private int messageType;
    @XStreamImplicit(itemFieldName="dialog")
    private List<String> messageContent;
    public ResponseMessage(int messageType, String... messageContent) {
        this.messageType = messageType;
        this.messageContent = Arrays.asList(messageContent);
    }
    public int getMessageType() {
        return messageType;
    }
    public void setMessageType(int messageType) {
        this.messageType = messageType;
    }
    public List<String> getMessageContent() {
        return messageContent;
    }
    public void setMessageContent(List<String> messageContent) {
        this.messageContent = messageContent;
    }
}


2.7 輸出內容如下

<message>
  <type>28</type>
  <dialog>終於爬上來了!</dialog>
  <dialog>我忘帶鑰匙了!!!</dialog>
</message>


(3)屬性別名


3.1響應消息

package com.favccxx.favsoft.pojo;
import java.util.Arrays;
import java.util.List;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import com.thoughtworks.xstream.converters.basic.BooleanConverter;
@XStreamAlias("message")
public class ResponseMessage {
    @XStreamAlias("type")
    @XStreamAsAttribute
    private int messageType;
    @XStreamImplicit(itemFieldName = "dialog")
    private List<String> messageContent;
    @XStreamAsAttribute
    @XStreamConverter(value = BooleanConverter.class, booleans = { false }, strings = { "yes", "no" })
    private boolean important;
    public ResponseMessage(int messageType, boolean important, String... messageContent) {
        this.messageType = messageType;
        this.messageContent = Arrays.asList(messageContent);
        this.important = important;
    }
    public int getMessageType() {
        return messageType;
    }
    public void setMessageType(int messageType) {
        this.messageType = messageType;
    }
    public List<String> getMessageContent() {
        return messageContent;
    }
    public void setMessageContent(List<String> messageContent) {
        this.messageContent = messageContent;
    }
}


3.2輸出內容

<message type="28" important="yes">
  <dialog>終於爬上來了!</dialog>
  <dialog>我忘帶鑰匙了!!!</dialog>
</message>


(4)所有字段變爲文本,值得注意的是,轉換爲文本的內容,只能是String類型的,因爲轉換器是StringValueConvertor。


package com.favccxx.favsoft.pojo;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.thoughtworks.xstream.converters.basic.BooleanConverter;
import com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter;
@XStreamAlias("message")
@XStreamConverter(value = ToAttributedValueConverter.class, strings = { "messageContent" })
public class ResponseMessage {
    @XStreamAlias("type")
    private int messageType;
    @XStreamAlias("content")
    private String messageContent;
    @XStreamConverter(value = BooleanConverter.class, booleans = { false }, strings = { "yes", "no" })
    private boolean important;
    public ResponseMessage(int messageType, boolean important, String messageContent) {
        this.messageType = messageType;
        this.messageContent = messageContent;
        this.important = important;
    }
    public int getMessageType() {
        return messageType;
    }
    public void setMessageType(int messageType) {
        this.messageType = messageType;
    }
    public String getMessageContent() {
        return messageContent;
    }
    public void setMessageContent(String messageContent) {
        this.messageContent = messageContent;
    }
    public boolean isImportant() {
        return important;
    }
    public void setImportant(boolean important) {
        this.important = important;
    }
}


<message type="200" important="yes">今天星期五</message>


(5)省略字段

package com.favccxx.favsoft.pojo;
import java.util.Arrays;
import java.util.List;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
import com.thoughtworks.xstream.converters.basic.BooleanConverter;
@XStreamAlias("message")
public class ResponseMessage {
    @XStreamOmitField
    private int messageType;
    @XStreamImplicit(itemFieldName="content")
    private List<String> messageContent;
    @XStreamConverter(value = BooleanConverter.class, booleans = { false }, strings = { "yes", "no" })
    private boolean important;
    public ResponseMessage(int messageType, boolean important, String... messageContent) {
        this.messageType = messageType;
        this.important = important;
        this.messageContent = Arrays.asList(messageContent);
    }
    public int getMessageType() {
        return messageType;
    }
    public void setMessageType(int messageType) {
        this.messageType = messageType;
    }
    public List<String> getMessageContent() {
        return messageContent;
    }
    public void setMessageContent(List<String> messageContent) {
        this.messageContent = messageContent;
    }
    public boolean isImportant() {
        return important;
    }
    public void setImportant(boolean important) {
        this.important = important;
    }
}
<message>
  <content>今天星期五</content>
  <content>明天去逛街</content>
  <important>yes</important>
</message>


(6)自動檢測註解

可以使用下述方法自動檢測註解,而不用每次都爲每個類設置註解

xstream.autodetectAnnotations(true);
// xstream.processAnnotations(ResponseMessage.class);


總結:使用註解比別名方便易用,但是當一個類被多次重用時,使用別名會更明智些。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章