首先这是我自己定义的一个xstream,这个xstream是为了在处理xml时能够加上而特别重写的。这个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("");
} 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 map = new HashMap();
// Element root = document.getRootElement();
// System.out.println(root.attributeValue("ff"));
// List elements = root.elements();
// for (Element e : elements) {
// System.out.println(e.getName() + "------" + e.getText() + "---");
// }
}
运行程序后得到结果如下:
分析结果,我们可以看到如下的现象:1.指定TextMessage中的ToUserName变为属性是成功的。2.指定TextMessage中的Content变为属性,别名为c_c是成功的,而// 指定TextMessage中的MsgType变为属性,别名为mtype则只做到了将MsgType变成了属性,却没有起别名。3.指定BaseMessage中的FromUserName变为属性,别名为ff是成功的。
通过上边这些现象,我是不是可以这样理解?一个类从另一个类中集成了某些属性的时候,通过这个类来为继承的属性器别名是不行的,而通过基类为这个继承的属性来起别名就可以。然而如果不起别名,那么可以通过useAttributeFor来将继承的字段指定为xml文件的属性呢?实际测试是这样的。