XStream 1.4.7、カスタム フィールド名に @XStreamAlias アノテーション、カスタム コンバーターに @XStreamConverter (日付やその他のカスタム Bean を表すため) を使用しています。ただし、null 値のカスタム コンバーターは呼び出されませんでした。私の目標は、null フィールドを含むオブジェクトのすべてのフィールドをシリアル化することでした。XML を非整列化する必要はありませんでした。
カスタム ReflectionConverter を作成することで、なんとかそれを行うことができました。XStream ライブラリから ReflectionConverter を拡張し、doMarshal メソッドをオーバーライドしました。私が変更した唯一のことは、null 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に感謝します
それが役に立てば幸い。誰かがこれに対するより良い解決策を見つけましたか?