/ / xstream deserialization problem - xml, xstream, xml-deserialization

problem deserializacji xstream - xml, xstream, xml-deserializacja

Próbuję zdeserializować następujący kod XML, gdzie„dzień” i „fulldob” to obiekty typy z ich indywidualnymi konwerterami dla niestandardowej logiki. Raz zdeserializowany i kiedy toXML do obiektu została zastosowana metoda, brakuje wartości „dzień” i „fulldob”. Oznacza to, że dzień i fulldob nie są poprawnie usuwane z serializacji. Czy ktoś może pomóc?

**********</ strong> wejściowy XML *******

 <primarydob>
<month>05</month>
<day>13</day>
<year>1982</year>
<fulldob>19820513</fulldob>
</primarydob>

****</ strong> XML z Object (po deserializacji powyższego XML) *******

 <primarydob>
<month>05</month>
<day/>
<year>1982</year>
<fulldob/>
</primarydob>

Oto obiekt dla "primarydob"

@XStreamAlias("dob")
public class DOBData {

@XStreamAlias("month")
private String month;

@XStreamAlias("day")
private DOBDay dobDay = new DOBDay();

@XStreamAlias("year")
private String year;

@XStreamAlias("fulldob")
private FullDOB fulldob = new FullDOB();

getters/setters
}

Oto obiekt dla "fulldob"

@XStreamAlias("fulldobdata")
@XStreamConverter(FullDOBDayMaskingConverter.class)
public class FullDOB {

@XStreamAlias("fulldob")
private String fullDOB;

public String getFullDOB() {
return fullDOB;
}

public void setFullDOB(String fullDOB) {

this.fullDOB = fullDOB;
}
}

Oto obiekt na "dzień"

@XStreamAlias("dobday")
@XStreamConverter(DOBDayMaskingConverter.class)
public class DOBDay {

@XStreamAlias("day")
private String day;

public String getDay() {
return day;
}
public void setDay(String day) {
this.day = day;
}
}

Dzięki,

Odpowiedzi:

0 dla odpowiedzi № 1

Oto kod DOBDayConverter:

public class DOBDayConverter extends ReflectionConverter {
public DOBDayConverter(XStream xstream) {
super(xstream.getMapper(), xstream.getReflectionProvider());
}

@Override
public void marshal(Object obj, HierarchicalStreamWriter writer, MarshallingContext context) {
DOBDay d = (DOBDay) obj;
try {
writer.setValue(d.getDay());
} catch (Exception e) {
}
}

@Override
public Object unmarshal(HierarchicalStreamReader reader,UnmarshallingContext context) {
DOBDay day = new DOBDay();

day.setDay(reader.getValue());

return day;
}

@SuppressWarnings("rawtypes")
@Override
public boolean canConvert(Class clazz) {
return clazz.equals(DOBDay.class);
}

}

a oto kod FullDOBConverter:

public class FullDOBConverter extends ReflectionConverter {
public FullDOBConverter(XStream xstream) {
super(xstream.getMapper(), xstream.getReflectionProvider());
}

@Override
public void marshal(Object obj, HierarchicalStreamWriter writer, MarshallingContext context) {
FullDOB fd = (FullDOB) obj;
try {
writer.setValue(fd.getFullDOB());
} catch (Exception e) {
}
}

@Override
public Object unmarshal(HierarchicalStreamReader reader,UnmarshallingContext context) {
FullDOB fd = new FullDOB();

fd.setFullDOB(reader.getValue());

return fd;
}

@SuppressWarnings("rawtypes")
@Override
public boolean canConvert(Class clazz) {
return clazz.equals(FullDOB.class);
}

}

Nie zapomnij zarejestrować konwerterów i przetworzyć adnotacje:

XStream xs = new XStream();
xs.processAnnotations(DOBData.class);
xs.processAnnotations(FullDOB.class);
xs.processAnnotations(DOBDay.class);
xs.registerConverter(new DOBDayConverter(xs));
xs.registerConverter(new FullDOBConverter(xs));