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 
{
    ...
}
Другие вопросы по тегам