用 XStream 序列化/反序列化 XML 为 Java 对象(实例)

XStream 项目主页

http://xstream.codehaus.org/

需要 lib

xstream-1.2.2.jar
xpp3_min-1.1.3.4.O.jar

这是 2007.5.24 打包的 lib

测试主程序

package  org.stephencat.test;
import  com.thoughtworks.xstream. * ;
import  java.util. * ;

/**
 * 测试 XStream 序列化和反序列化
 * 
@author  stephen.wjj
 *
 
*/
public   class  XStreamTest {
    
    
/**
     * 测试序列化
     
*/
    
public   static   void  TestSerializer(){
        System.out.println(
" ===== Testing serializer ===== " );
        Person p1 
=   new  Person();
        p1.setName(
" AAA " );
        Person p2 
=   new  Person();
        p2.setName(
" BBB " );
        Person p3 
=   new  Person();
        p3.setName(
" CCC " );
        
        Group g 
=   new  Group();
        g.getPersons().add(p1);
        g.getPersons().add(p2);
        g.getPersons().add(p3);
        g.setName(
" KFC " );
        
        XStream xstream 
=   new  XStream();
        
        
//  声明标记名称对应的 Java 类
        xstream.alias( " group " , Group. class );
        xstream.alias(
" person " , Person. class );
        
        
//  把 Group 的 name 属性视为 XML 属性
        xstream.useAttributeFor(Group. class " name " );
        
//  忽略 XML 中的 <persons></persons> 标记
        xstream.addImplicitCollection(Group. class " persons " );
        
        System.out.println(xstream.toXML(g));
    }
    
    
/**
     * 测试反序列化
     
*/
    
public   static   void  TestDeserializer(){
        System.out.println(
" ===== Testing deserializer ===== " );
        String xml 
=   " <group name=/ " KFC/ " ><person><name>AAA</name></person><person><name>BBB</name></person><person><name>CCC</name></person></group> " ;
        XStream xstream 
=   new  XStream();
        
        
//  声明标记名称对应的 Java 类
        xstream.alias( " group " , Group. class );
        xstream.alias(
" person " , Person. class );
        
        
//  把 Group 的 name 属性视为 XML 属性
        xstream.useAttributeFor(Group. class " name " );
        
//  忽略 XML 中的 <persons></persons> 标记
        xstream.addImplicitCollection(Group. class " persons " );
        
        Group g 
=  (Group) xstream.fromXML(xml);
        System.out.println(
" Group name =  " + g.getName());
        System.out.println(
" Group has persons =  " + g.getPersons().size());
        System.out.println(
" Group persons: " );
        
if (g.getPersons().size()  >   0 ){
            Iterator it 
=  g.getPersons().iterator();
            
while (it.hasNext()){
                Person p 
=  (Person)it.next();
                
if (p != null ){
                    System.out.println(p.getName());
                }
else {
                    System.out.println(
" Err! person instance is null! " );
                }
            }
        }
    }

    
/**
     * 
@param  args
     
*/
    
public   static   void  main(String[] args) {
        
//  TODO Auto-generated method stub
        TestSerializer();
        TestDeserializer();

    }

}


Console 输出

=====  Testing serializer  =====
<group name
= " KFC " >
  <person>
    <name>AAA</name>
  </person>
  <person>
    <name>BBB</name>
  </person>
  <person>
    <name>CCC</name>
  </person>
</group>
=====  Testing deserializer  =====
Group name 
=  KFC
Group has persons 
=   3
Group persons:
AAA
BBB
CCC


注:

用于反序列化的字符串(String xml = "...")中带有 XML 头部时不会影响结果

<? xml version="1.0" ?>



用于序列化的实体类

Group

package  org.stephencat.test;
import  java.util. * ;

/**
 * 包含若干 Person 的 Group 
 * 
@author  stephen
 *
 
*/
public   class  Group {
    
    
/**
     * Group名称<br>
     * 需求规定这是 XML 中的一个属性
     
*/
    
private  String name;
    
/**
     * 需求规定这是一堆若干数量的 person 标记
     
*/
    
private  List persons  =   new  ArrayList();
    
    
public  String getName() {
        
return  name;
    }
    
public   void  setName(String name) {
        
this .name  =  name;
    }
    
public  List getPersons() {
        
return  persons;
    }
    
public   void  setPersons(List persons) {
        
this .persons  =  persons;
    }

}


Person

package  org.stephencat.test;

/**
 * Group 里面的 Person
 * 
@author  stephen
 *
 
*/
public   class  Person {
    
    
/**
     * 需求规定这是一个 name 标记
     
*/
    
private  String name;

    
public  String getName() {
        
return  name;
    }

    
public   void  setName(String name) {
        
this .name  =  name;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值