不知道有人用XStream来序列化对象和反序列化对象没有?如果有的话,请指教下小弟!将不胜感激!
这是个序列化的类,Employee是父类,SE是继承它的子类。SE有1个私有属性basemoney,name,gender,age继承自父类。其中gender是个枚举,包含2个成员:Famale,Male
package cn.java.xml;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;import com.thoughtworks.xstream.XStream;
public class SEWriter {
static List<Employee> list=null;
static{
list=new ArrayList<Employee>();
list.add(new SE("WinterYan","21", Gender.Male, 2000));
list.add(new SE("ZenKiTang","19", Gender.Male, 2000));
list.add(new SE("LighterLee","24", Gender.Male, 2000));
}
public static void main(String[] args) {
XStream xs=new XStream();
try {
FileOutputStream fs=new FileOutputStream("e:/employee.xml");
xs.toXML(se, fs);
System.out.println("序列化成功!");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
        }
}序列化成功后的xml文件内容:<list>  <cn.java.xml.SE>
    
<baseMoney>2000.0</baseMoney>
    
<name>WinterYan</name>
    
<age>21</age>
    
<gender>Male</gender>
  
</cn.java.xml.SE>
  
<cn.java.xml.SE>
    
<baseMoney>2000.0</baseMoney>
    
<name>ZenKiTang</name>
    
<age>19</age>
    
<gender reference="../../cn.java.xml.SE/gender"/>
  
</cn.java.xml.SE>
  
<cn.java.xml.SE>
    
<baseMoney>2000.0</baseMoney>
    
<name>LighterLee</name>
    
<age>24</age>
    
<gender reference="../../cn.java.xml.SE/gender"/>
  
</cn.java.xml.SE></list>然后我想再反序列化,却读取不成功,调试又看不出来什么。也没有任何异常,跪求指教!反序列化的代码:package cn.java.xml;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
public class XSReader {
public static void main(String[] args) {
XStream xs=new XStream(new DomDriver());
List<Employee> list=new ArrayList<Employee>();
try {
FileInputStream fis=new FileInputStream("e:/employee.xml");
xs.fromXML(fis, list);
for(Employee ep : list){
System.out.println(ep.toString());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}输出为:
name null
age null
gender null
basemoney 0.0

解决方案 »

  1.   

    难道就没人知道XStream?挂了这么久了,连个回复都没有,郁闷啊。100分还散不出去了...
      

  2.   

    Employee.java
    public class Employee {
        /**
         * Describe name here.
         */
        private String name;
        /**
         * Describe age here.
         */
        private int age;
        /**
         * Describe gender here.
         */
        private Gender gender;    /**
         * Get the <code>Gender</code> value.
         *
         * @return a <code>Gender</code> value
         */
        public final Gender getGender() {
            return gender;
        }    /**
         * Set the <code>Gender</code> value.
         *
         * @param gender The new Gender value.
         */
        public final void setGender(final Gender gender) {
            this.gender = gender;
        }    /**
         * Get the <code>Age</code> value.
         *
         * @return an <code>int</code> value
         */
        public final int getAge() {
            return age;
        }    /**
         * Set the <code>Age</code> value.
         *
         * @param age The new Age value.
         */
        public final void setAge(final int age) {
            this.age = age;
        }    /**
         * Get the <code>Name</code> value.
         *
         * @return a <code>String</code> value
         */
        public final String getName() {
            return name;
        }    /**
         * Set the <code>Name</code> value.
         *
         * @param name The new Name value.
         */
        public final void setName(final String name) {
            this.name = name;
        }    protected Employee(){}
        public Employee(String name,int age,Gender gender){
            this.name = name;
            this.age = age;
            this.gender = gender;
        }
    }
    Gender.java
    public enum Gender {
        Female, Male
    }
    SE.java
    public class SE extends Employee {
        /**
         * Describe basemoney here.
         */
        private int basemoney;    /**
         * Get the <code>Basemoney</code> value.
         *
         * @return an <code>int</code> value
         */
        public final int getBasemoney() {
            return basemoney;
        }    /**
         * Set the <code>Basemoney</code> value.
         *
         * @param basemoney The new Basemoney value.
         */
        public final void setBasemoney(final int basemoney) {
            this.basemoney = basemoney;
        }    protected SE(){}
        public SE(String name, int age, Gender gender, int basemoney){
            super(name,age,gender);
            this.basemoney = basemoney;
        }
    }
    import java.util.ArrayList;
    import java.util.List;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;import com.thoughtworks.xstream.XStream;public class XExample {
        public static void main(final java.lang.String[] args) {
            List<Employee> list = new ArrayList<Employee>();
            list.add(new SE("Winter Yan", 21, Gender.Male, 2000));
            list.add(new SE("ZenKi Tang", 19, Gender.Male, 2000));
            list.add(new SE("Ligher Lee", 24, Gender.Male, 2000));        XStream xs = new XStream();
            try (FileOutputStream fs = new FileOutputStream("employee.xml")){
                    xs.toXML(list,fs);
                } catch (IOException e) {
            }        try (FileInputStream fi = new FileInputStream("employee.xml")){
                    List<Employee> employees = (List<Employee>)xs.fromXML(fi);
                    for (Employee e: employees) {
                        System.out.println(e.getName());
                    }
                } catch (IOException e) {        }    }
    }
    employee.xml<list>
      <SE>
        <name>Winter Yan</name>
        <age>21</age>
        <gender>Male</gender>
        <basemoney>2000</basemoney>
      </SE>
      <SE>
        <name>ZenKi Tang</name>
        <age>19</age>
        <gender>Male</gender>
        <basemoney>2000</basemoney>
      </SE>
      <SE>
        <name>Ligher Lee</name>
        <age>24</age>
        <gender>Male</gender>
        <basemoney>2000</basemoney>
      </SE>
    </list>终端输出:
    Winter Yan
    ZenKi Tang
    Ligher Lee
      

  3.   

    http://happyran.zbpifa.com
    http://007ej.com/user.asp
      

  4.   

    http://007ej.com/user.asp
    http://happyran.zbpifa.com
      

  5.   

    请问Huntor前辈,您序列化出来的xml文件中得gender属性,为什么后面两个不是<gender reference="../../cn.java.xml.SE/gender"/>
    呢?是不是在封装的时候加了final标记?原来formXML()还有返回值啊,阿三害人额!
      

  6.   

    我在jdk1.7.0b147下使用xstream 1.3.1。你可以看这页Object references
    xstream.setMode(XStream.NO_REFERENCES);
      

  7.   

    final是我使用编辑器生成getter/setter时自动加上了。我觉得没什么影响,就保留了下来。
      

  8.   

    Huntor前辈,为什么我连父类的字段都设置的和你一模一样了,序列化出来的xml文件,后面的两个对象的gender还是那个<gender reference="../../cn.java.xml.SE/gender"/>?想不通啊,跪求指点!
      

  9.   

    忘了说,我的jdk是1.6,xstream是1.22
      

  10.   

    上面的那个链接里说的就是这个。我google “xstream reference” 就找到了。
      

  11.   

    啊,实在是太感谢了,终于把这个问题解决了!果然是要xs.setMode的!!!谢谢您的指教!