2012-10-25 11 views
7

が、私はその後XStreamのは

class Student 
{ 
String name; 
int age; 
String teacher; 
} 

があるとnull値をシリアル化私は意味:

<student> 
    <name>toto</name> 
    <age>0</age> 
    <teacher></teacher> 
</student> 

私は

st.setTeacher(""); 

を行う場合は、教師がnullでない場合、それが可能です。

私はカスタムコンバータを試しましたが、null値がコンバータに送信されないようです。

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 
} 

、あなたは次のようにコンバータクラスを作成するために必要なすべてを::次のように

答えて

1

まず第一には、あなたの中にStudentクラスのgetterメソッドとsetterメソッドを提供

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)); 
    } 

} 

が、それはあなたのご希望します答え:....幸せ学習:)

2

私はXStream 1.4.7、カスタムフィールド名の@XStreamAliasアノテーション、カスタムコンシールのための@XStreamConverterを使用していますverters(日付と他のカスタムBeanを表す)。しかし、ヌル値のカスタムコンバータは呼び出されませんでした。 私の目標は、nullを含むオブジェクトのすべてのフィールドを直列化することでした。私はXMLを非整列化する必要はありませんでした。

私はカスタムReflectionConverterを作成することでそれを管理しました。 ReflectionConverterをXStreamライブラリから拡張し、doMarshalメソッドをオーバーロードしました。私はヌルinfo.valuesする方法writeField呼んでいた変更だけの事:その後

new Object() { 
{ 
    for (Iterator fieldIter = fields.iterator(); fieldIter.hasNext();) { 
     FieldInfo info = (FieldInfo) fieldIter.next(); 
     if (info.value != null) { 
      //leave the code unchanged 
      ... 
     } else { 
      //add this to write null info.value to xml 
      Log.info("MyCustomReflectionConverter -> serialize null field: " + info.fieldName); 
      writeField(info.fieldName, null, info.type, info.definedIn, info.value); 
     } 
    } 
    //... leave the rest of the code unchanged 
} 
}; 

は、私が(非常に低い優先度で、あなたのコンバータを登録することが非常に重要である)そのようxStreamではインスタンスを作成:

StaxDriver driver = new StaxDriver(new NoNameCoder()) { 
    @Override 
    public StaxWriter createStaxWriter(XMLStreamWriter out) throws XMLStreamException { 
     // the boolean parameter controls the production of XML declaration 
     return createStaxWriter(out, false); 
    } 
}; 

XStream xStream = new XStream(driver); 
xStream.autodetectAnnotations(true);//needed to process aliases 
//register MyCustomReflectionConverter 
MyCustomReflectionConverter reflectionConverter = new MyCustomReflectionConverter (xStream.getMapper(), new SunUnsafeReflectionProvider()); 
xStream.registerConverter(reflectionConverter, XStream.PRIORITY_VERY_LOW); 

Mark Nabours氏のソリューションのおかげでhere

希望します。誰かがこれに対してより良い解決策を見つけましたか?

0

あなたは、空の文字列

String teacher = ""; 

または最適化された1 :)

String teacher = StringUtils.EMPTY; 
を置くことができます