1

XmlInclude と同じことを C# で行う Java アノテーションを探しています。

ソケットを介して 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 は (同様に) 文字列を自動的に処理します。しかし、別のオブジェクトがある場合は、XmlInclude の他の既知のクラスを使用して C# をアナウンスできます。Javaに似たようなものはありますか?

4

1 に答える 1

0

Object 型のプロパティの @XmlElement は正しいマッピングです。

@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 
{
    ...
}
于 2011-03-31T14:15:23.787 に答える