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 № 1Oto 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));