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文件的属性呢?实际测试是这样的。

posted @ 2015-11-12 14:44  qz程程  阅读(848)  评论(0编辑  收藏  举报