Cml XmlSerializer's XmlInclude эквивалент в Java
Я ищу аннотацию Java, которая делает то же самое, что XmlInclude делает в C#.
Я получаю структуру XML через сокет. Структура выглядит так:
<Answer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<FunctionReturnCode>0</FunctionReturnCode>
<AnswerObject xsi:type="Status">
<DoorOpen>79</DoorOpen>
</AnswerObject>
</Answer>
Соответствующий Java-класс определяется следующим образом:
@XmlRootElement(name="Answer")
@XmlType(propOrder = {"functionReturnCode", "answerObject"})
public class Answer
{
private Object m_answerObject = null;
private long m_uiFunctionReturnCode = 0;
@XmlElement(name="FunctionReturnCode")
public long getFunctionReturnCode(){ return this.m_uiFunctionReturnCode; }
public void setFunctionReturnCode(long _uiFunctionReturnCode) { this.m_uiFunctionReturnCode = _uiFunctionReturnCode; }
@XmlElement(name="AnswerObject")
public Object getAnswerObject() { return this.m_answerObject; }
public void setAnswerObject(Object _answerObject) { this.m_answerObject = _answerObject;}
}
В C# класс выглядит примерно так:
[XmlInclude(typeof(SelStatus))]
<<< это кажется мне волшебной точкой публичного класса Ответ: ICloneable
{
private uint m_uiFunctionReturnCode = 0;
private object m_answerObject = null;
.....Setters/Getters here as well
}
Проблема в том, что "AnswerObject" может быть объектом любого типа. В моем примере "AnswerObject" - это объект типа "Status", но он может быть также строкой или чем-либо еще.
В C# я могу использовать XmlSerializer для десериализации структуры XML. В Java я использую следующее:
JAXBContext context = JAXBContext.newInstance(Answer.class);
Unmarshaller unmarschaller = context.createUnmarshaller();
C# и Java (также) обрабатывают строки автоматически. Но в случае, если есть другой объект, то строка, которую я могу объявить C# с помощью XmlInclude других известных классов. Есть ли что-то подобное в Java?
1 ответ
@XmlElement для свойства типа Object является правильным отображением:
@XmlElement(name="AnswerObject")
public Object getAnswerObject() { return this.m_answerObject; }
public void setAnswerObject(Object _answerObject) { this.m_answerObject = _answerObject;}
Вам нужно будет убедиться, что ваш JAXBContext знает о любых возможных значениях для AnswerObject. Вы можете сделать свой JAXBContext из этих классов при его создании:
JAXBContext.newInstance(Answer.class, ValueA.class, ValueB.class);
Или укажите их с помощью аннотации @XmlSeeAlso.
@XmlRootElement(name="Answer")
@XmlType(propOrder = {"functionReturnCode", "answerObject"})
@XmlSeeAlso{{ValueA.class, ValueB.class}
public class Answer
{
...
}