Cml XmlSerializer XmlInclude эквивалент в Java - PullRequest
1 голос
/ 31 марта 2011

Я ищу аннотацию 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 </p>

{

    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 Ответ

0 голосов
/ 31 марта 2011

@ 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 
{
    ...
}
...