【问题标题】:C# XmlSerializer's XmlInclude equivalent in JavaC# XmlSerializer 在 Java 中的 XmlInclude 等效项
【发布时间】:2011-03-31 11:56:00
【问题描述】:

我正在寻找与 C# 中的 XmlInclude 相同的 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 Class定义如下:

@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))]

{

    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中有类似的东西吗?

【问题讨论】:

    标签: c# java xml annotations xmlinclude


    【解决方案1】:

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

    【讨论】:

    • Unmarshaller 在对象既不是 null 也不是字符串的情况下返回“ElementNSImpl”。但我想要正确填充的对象。就像 .NET 一样 :) 正如我之前写的那样,字符串或 null 被正确解组。
    • 好吧,我终于知道问题出在哪里了。将事件处理程序添加到解组器(使用 setEventHandler 方法)后,我收到以下错误消息。 “无法识别的类型名称:状态。您的意思是状态吗?”.....呵呵 :D 所以我在课堂上添加了@XmlType(name="Status") 并且知道一切正常。谢谢你 Blaise,你的提示是我正在寻找的缺失部分:)
    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2015-10-23
    • 1970-01-01
    相关资源
    最近更新 更多