Tôi đang sử dụng chú thích XStream 1.4.7, @XStreamAlias cho tên trường tùy chỉnh, @XStreamConverter cho con tùy chỉnh verters (để đại diện cho ngày tháng và các bean tùy chỉnh khác). Tuy nhiên, một bộ chuyển đổi tùy chỉnh cho các giá trị null thậm chí còn không được gọi. Mục tiêu của tôi là tuần tự hóa tất cả các trường của đối tượng, bao gồm cả các trường rỗng, tôi không cần unmarshal XML.
Tôi đã thực hiện điều đó bằng cách tạo Trình chỉnh sửa phản chiếu tùy chỉnh. Tôi mở rộng ReflectionConverter từ thư viện XStream và overrode phương pháp doMarshal. Điều duy nhất tôi đã thay đổi được cách gọi phương thức writeField cho info.values null:
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
}
};
Sau đó, tôi tạo xStream dụ như vậy (nó là rất quan trọng để đăng ký chuyển đổi của bạn với ưu tiên rất thấp):
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);
Nhờ Mark Nabours cho giải pháp của mình here
Hy vọng điều đó sẽ hữu ích. Có ai tìm thấy một giải pháp tốt hơn cho điều này?