2012-10-25 20 views
7

varsayalım Ben SonraXStream boş değerler seri

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

:

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

}

bana verir:

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

boş değerler başa çıkmak için bir yol var mı? Yani:

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

Ben

st.setTeacher(""); 

yaparsanız ama öğretmen null değilse olması mümkündür.

Özel bir dönüştürücü ile denedim, ancak boş değer dönüştürücüye gönderilmiyor gibi görünüyor.

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 
} 

Şimdi, aşağıdaki gibi dönüştürücü sınıf oluşturmak için gereken tüm:

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

} 

sizde Umut şöyle hepsinden

cevap

1

İlk sende Student sınıf alıcı ve ayarlayıcı yöntemleri sağlamak answer .... Mutlu Öğrenme :)

2

Özel alan adları için @ XStreamConverter, XStream 1.4.7, @XStreamAlias ​​ek notunu kullanıyorum verters (tarihleri ​​ve diğer özel fasülyeleri temsil etmek için). Bununla birlikte, null değerleri için özel bir dönüştürücü bile çağrılmadı. Amacım, null olanlar da dahil olmak üzere, nesnenin tüm alanlarını serileştirmekti.

Özel bir ReflectionConverter oluşturarak bunu yapmayı başardım. ReflectionConverter'i XStream kitaplığından geliştirdim ve doMarshal yöntemini geçersiz kıldım. Ben Değişen tek şey, boş info.values ​​için writeField yöntemini çağırıyordu:

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); 
: Bundan sonra

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

, ben böyle xStream örneği (çok düşük öncelikli dönüştürücü kayıt için çok önemlidir) oluşturuldu onun çözümü için Mark Nabours için

Teşekkür here

yardımcı olur Umut. Bunun için daha iyi bir çözüm bulmuş olan var mı?

0

Bir boş bir String

String teacher = ""; 

Ya optimize tek :)

String teacher = StringUtils.EMPTY; 
koyabilirsiniz
İlgili konular