OK、それでなんとかこれを機能させることができましたが、Fabianとbasszeroが述べたように、問題を回避するより高いレベルの方法を見つけると思うほど厄介な解決策です. 次のコードの考え方は、シリアル化するデータへの一般的なシリアル化可能な参照を作成することです。これは、シリアル化をプログラムで実行するための JAXB Java タイプ アダプターと、結果の XML を格納する文字列フィールドを保持します。
注: コードは表示用に大幅に簡略化されています...
// Create an instance of this class, to wrap up whatever you want to custom-serialize
@XmlRootElement
public static class SRef
{
public SRef() { }
public SRef(Object ref)
{
this.ref = ref;
}
@XmlJavaTypeAdapter(SRefAdapter.class)
public Object ref;
}
// This is the adapted class that is actually serialized
public static class SRefData
{
// This is a hint field to inform the adapter how to deserialize the xmlData
@XmlAttribute
public String hint;
// This contains the custom-serialized object
@XmlElement
public String xmlData;
}
// Converts an object to and from XML using a custom serialization routine
public static class SRefAdapter extends XmlAdapter<SRefData, Object>
{
@Override
public SRefData marshal(Object value) throws Exception
{
if (value instanceof MyType)
{
SRefData data = new SRefData();
data.xmlData = doSomeSpecificSerialization(value);
data.hint = "myType";
return data;
}
throw new IllegalArgumentException("Can't serialize unknown object type " + value.getClass());
}
@Override
public Object unmarshal(SRefData refData) throws Exception
{
if (refData.hint.equals("myType"))
{
return doSomeSpecificDeserialization(refData.xmlData);
}
throw new IllegalArgumentException("Unhandled hint value in SRefData: " + refData.hint);
}
}