xstream,节点属性起别名时这样的问题你遇到过吗
首先这是我自己定义的一个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_c xstream.aliasAttribute(TextMessage.class, "Content", "c_c"); // 指定TextMessage中的MsgType变为属性,别名为mtype xstream.aliasAttribute(TextMessage.class, "MsgType", "mtype"); // 指定BaseMessage中的FromUserName变为属性,别名为ff xstream.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文件的属性呢?实际测试是这样的。