私は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
希望します。誰かがこれに対してより良い解決策を見つけましたか?