首先这是我自己定义的一个xstream,这个xstream是为了在处理xml时能够加上<![CDATA[------]]>而特别重写的。这个xstream是没有任何问题的。
private static XStream xstream = new XStream(new XppDriver() {public HierarchicalStreamWriter createWriter(Writer out) {return new PrettyPrintWriter(out) {boolean cdata = true;@SuppressWarnings("rawtypes")public void startNode(String name, Class clazz) {super.startNode(name, clazz);}protected void writeText(QuickWriter writer, String text) {if (cdata) {writer.write("<![CDATA[");writer.write(text);writer.write("]]>");} else {writer.write(text);}}};}});
然后是我们要转换为xml文件的类,这里我实现了一个basemessage,用来包含所有消息都包含着的通用属性字段。然后实现了一个textmessage来专门处理文本消息,textmessage是集成了basemessage的。代码如下;
public class BaseMessage {private String ToUserName;private String FromUserName;private long CreateTime;private String MsgType;public String getToUserName() {return ToUserName;}public void setToUserName(String toUserName) {ToUserName = toUserName;}public String getFromUserName() {return FromUserName;}public void setFromUserName(String fromUserName) {FromUserName = fromUserName;}public long getCreateTime() {return CreateTime;}public void setCreateTime(long createTime) {CreateTime = createTime;}public String getMsgType() {return MsgType;}public void setMsgType(String msgType) {MsgType = msgType;}}
public class TextMessage extends BaseMessage {private String Content;public String getContent() {return Content;}public void setContent(String content) {this.Content = content;}}
然后用xstream做如下的测试:
public static void main(String[] args) throws Exception {TextMessage message = new TextMessage();message.setFromUserName("1");message.setToUserName("2");message.setCreateTime(System.currentTimeMillis());message.setMsgType("art");message.setContent("133");xstream.alias("xml", message.getClass());// 这里指定TextMessage中的ToUserName变为属性xstream.useAttributeFor(TextMessage.class, "ToUserName");// 指定TextMessage中的Content变为属性,别名为c_cxstream.aliasAttribute(TextMessage.class, "Content", "c_c");// 指定TextMessage中的MsgType变为属性,别名为mtypexstream.aliasAttribute(TextMessage.class, "MsgType", "mtype");// 指定BaseMessage中的FromUserName变为属性,别名为ffxstream.aliasAttribute(BaseMessage.class, "FromUserName", "ff");String result = xstream.toXML(message);System.out.println(result);// StringReader readers = new StringReader(result);// InputSource inputSource = new InputSource(readers);// SAXReader reader = new SAXReader();// Document document = null;// document = reader.read(inputSource);// Map<String, String> map = new HashMap<String, String>();// Element root = document.getRootElement();// System.out.println(root.attributeValue("ff"));// List<Element> elements = root.elements();// for (Element e : elements) {// System.out.println(e.getName() + "------" + e.getText() + "---");// }}
运行程序后得到结果如下:
<xml ToUserName="2" ff="1" MsgType="art" c__c="133"><CreateTime><![CDATA[1447310176809]]></CreateTime>
</xml>
分析结果,我们可以看到如下的现象:1.指定TextMessage中的ToUserName变为属性是成功的。2.指定TextMessage中的Content变为属性,别名为c_c是成功的,而// 指定TextMessage中的MsgType变为属性,别名为mtype则只做到了将MsgType变成了属性,却没有起别名。3.指定BaseMessage中的FromUserName变为属性,别名为ff是成功的。
通过上边这些现象,我是不是可以这样理解?一个类从另一个类中集成了某些属性的时候,通过这个类来为继承的属性器别名是不行的,而通过基类为这个继承的属性来起别名就可以。然而如果不起别名,那么可以通过useAttributeFor来将继承的字段指定为xml文件的属性呢?实际测试是这样的。