【转帖】用XStream实现序列化和反序列化xml的例子(class<->xml转换)

这些天要用到一些序列化相关知识,听人说XStream在序列化和反序列化xml方面很好,于是学了点他的api,写了个小例子:

 

先是一个用来序列化的类Parent:

package test.wei.tian.xstream;   
import java.util.List;   
import java.util.ArrayList;   
public class Parent {   
    private String name;   
    private String age;   
    private List<Son> sons=new ArrayList<Son>();   
    /*  
     * 写几个对应的getter和setter函数  
     */  
    public String getName(){   
        return name;   
    }   
    public void setName(String name)   
    {   
        this.name=name;   
    }   
    public String getAge(){   
        return age;   
    }   
    public void setAge(String age)   
    {   
        this.age=age;   
    }   
    public List getSons(){   
        return sons;   
    }   
    public void setSons(List sons){   
        this.sons=sons;   
    }   
}  

  他里面用到了Son类,Son类如下:

package test.wei.tian.xstream;   
  
public class Son {   
    public Son(String name, String grade) {   
        super();   
        this.name = name;   
        this.grade = grade;   
    }   
    public Son() {   
    }   
    private String name;   
    private String grade;   
    public String getName() {   
        return name;   
    }   
    public void setName(String name) {   
        this.name = name;   
    }   
    public String getGrade() {   
        return grade;   
    }   
    public void setGrade(String grade) {   
        this.grade = grade;   
    }   
  
       
}  

 

然后测试序列化以及反序列化:

package test.wei.tian.xstream;   
import java.util.ArrayList;   
import java.util.Iterator;   
import java.util.List;   
  
import com.thoughtworks.xstream.XStream;   
import com.thoughtworks.xstream.io.xml.DomDriver;   
public class TestXStream {   
    private String tempStr="";   
 public String testSerialized(){   
        XStream xs=new XStream();   
        Son son1=new Son();   
        son1.setGrade("88");   
        son1.setName("Tom");   
        Son son2=new Son();   
        son2.setGrade("95");   
        son2.setName("Lilei");   
           
        Parent parent=new Parent();   
        parent.setAge("42");   
        parent.setName("Toris");   
        //将定义的Son放到Parent的链表中   
        parent.getSons().add(son1);   
        parent.getSons().add(son2);   
        //给类取别名。要不然会出现,因为生成xml时会自动填充为类名   
        //<test.wei.tian.xstream.Parent>而不是parent   
        xs.alias("Parent", Parent.class);   
        xs.alias("Son", Son.class);   
        //将name,age设置为属性而不是子标记   
        xs.useAttributeFor(Parent.class, "name");   
        xs.useAttributeFor(Parent.class,"age");   
        //隐藏标记sons,因为Parent类有三个属性:name,age,sons。   
        //name和age都被设定为属性了,sons包括2个Son类型的变量.   
        //会出现<sons><Son><name>xxx</name></Son><sons>,这样看着   
        //有些多余,故而隐藏sons这个标签对。   
        xs.addImplicitCollection(Parent.class, "sons");   
        //用XStream对象xs调用toXML函数,将对象Parent转化为xml,此即序列化   
        tempStr=xs.toXML(parent);   
        //System.out.println(tempStr);   
        return tempStr;   
 }   
    
  
public void testDeserialized(){   
     String xml=testSerialized();   
     XStream xs=new XStream(new DomDriver());   
     Parent parent=new Parent();   
        
     xs.alias("Parent", Parent.class);   
     xs.alias("Son", Son.class);   
        
     xs.useAttributeFor(Parent.class,"name");   
     xs.useAttributeFor(Parent.class, "age");   
        
     xs.addImplicitCollection(Parent.class, "sons");   
     parent=(Parent)xs.fromXML(xml);   
     System.out.println("Parent name is: "+parent.getName());   
     System.out.println("Parent Age is: "+parent.getAge());   
     List<Son> sons=new ArrayList<Son>();   
     sons=parent.getSons();   
     Iterator<Son> it=sons.iterator();   
     System.out.println(parent.getName()+" has "+sons.size()+" sons");   
     System.out.println("They are:");   
     while(it.hasNext()){   
         Son son=(Son)it.next();   
         System.out.println(son.getName()+". His grade is "+son.getGrade());   
            
     }   
 }   
public static void main(String[]s){   
    TestXStream txs=new TestXStream();   
    String str=txs.testSerialized();   
    System.out.println("*****Serialized result********:");   
    System.out.println(str);   
    System.out.println("*****Deserialized result:******");   
    txs.testDeserialized();   
}   
}  

 

不过为了方便没有写入和读取文件,只是直接用了String,Deserilized用的是Serilized的结果。

 

结果是:

*****Serialized result********:   
<Parent name="Toris" age="42">  
  <Son>  
    <name>Tom</name>  
    <grade>88</grade>  
  </Son>  
  <Son>  
    <name>Lilei</name>  
    <grade>95</grade>  
  </Son>  
</Parent>  
*****Deserialized result:******   
Parent name is: Toris   
Parent Age is: 42   
Toris has 2 sons   
They are:   
Tom. His grade is 88   
Lilei. His grade is 95  

 

你可能感兴趣的:(xml)