XStream序列化空值

twe*_*sat 7 java serialization xstream

假设我有

class Student
{
String name;
int    age;
String teacher;
}
Run Code Online (Sandbox Code Playgroud)

然后 :

public class App1
{
    public static void main(String[] args)
    {
        Student st = new Student();
        st.setName("toto");

        XStream xs = new XStream();

        xs.alias("student",Student.class);

        System.out.println(xs.toXML(st));
    }
Run Code Online (Sandbox Code Playgroud)

}

给我 :

<student>
  <name>toto</name>
  <age>0</age>
</student>
Run Code Online (Sandbox Code Playgroud)

有没有办法处理空值?我的意思是 :

<student>
  <name>toto</name>
  <age>0</age>
  <teacher></teacher>
</student>
Run Code Online (Sandbox Code Playgroud)

如果我这样做是可能的

st.setTeacher("");
Run Code Online (Sandbox Code Playgroud)

但如果老师是空的,那就不行了

我尝试使用自定义转换器,但似乎空值不会发送到转换器.

Sam*_*aan 1

首先在类中提供 getter 和 setter 方法,Student如下所示:

public class Student{
   String name;
   int age;
   String teacher;
   public void setName(String name){
       this.name = name;
   }
   public String getName(){
      return name;
   }
.......
......//Like that mention other getter and setter method
}
Run Code Online (Sandbox Code Playgroud)

现在,您需要创建转换器类,如下所示:

public class StudentConverter implements Converter{
    public boolean canConvert(Class clazz) {
         return clazz.equals(Test.class);
    }
    public void marshal(Object value, HierarchicalStreamWriter writer,
         MarshallingContext context) {
       Student student = (Student ) value;
       writer.startNode("name");
       writer.setValue(test.getName());
       writer.endNode();
       writer.startNode("age");
       writer.setValue(test.getAge());
       writer.endNode();
       writer.startNode("teacher");
       writer.setValue("");
       writer.endNode();
   }
    public Object unmarshal(HierarchicalStreamReader reader,
         UnmarshallingContext context) {
       Student student = new Student();
       test.setName(reader.getNodeName());
       test.setAge(reader.getNodeName());
       test.setTeacher(reader.getNodeName());
       return student;
    }
}

Your main class will the like that:

public class App1{
    public static void main(String args[]) {
        XStream stream = new XStream(new StaxDriver());
        Student st = new Student();
        st.setName("ABC");
        t.setAge(21);
        stream.registerConverter(new StudentConverter());
        stream.alias("student", Student.class);
        System.out.println(stream.toXML(st));
   }

}
Run Code Online (Sandbox Code Playgroud)

希望这是您的答案....快乐学习:)