android - @Order 注解对 XML 序列化顺序没有影响

标签 android xml soap simple-framework retrofit2

我将 Retrofit 2 与 SimpleXmlConverter 一起使用,我在创建 Soap 请求对象时遇到了一个问题,该对象基本上是一个具有 4 个子元素的元素,每个子元素都是不同的数据类型。

这是我要生成的 XML 输出。必须遵守元素顺序:

 <prf:container>
    <prf:aaa>111111111</prf:aaa>
    <prf:bbb>true</prf:bbb>
    <prf:element>
        <prf:ddd>50</prf:ddd>
        <prf:eee>false</prf:eee>
    </prf:element>
    <prf:ccc>textcontent</prf:ccc>
</prf:container>

现在,这是我的 Android 类 Container.java,代表将被序列化的 Soap 请求对象:

@Root (name = "prf:container")
@Order(elements={"prf:aaa", "prf:bbb", "prf:element", "prf:ccc"})
public class Container {

    @Element (name = "prf:aaa")
    private int aaa;

    @Element(name = "prf:bbb")
    private boolean bbb;

    @Element (name = "prf:element", required = false)
    private MyElement myElement;

    @Element (name = "prf:ccc", required = false)
    private String ccc;

}

根据简单 XML 框架文档:

By default serialization of fields is done in declaration order.

然而,在 Android 中,这不是真的,至少在某些情况下是这样。无论我如何在我的 Container 类中设置字段声明顺序,输出始终具有相同的元素顺序。这是一个已知错误,并且已在其他 SO 帖子中报告过。

不过,这个问题还是有解决办法的。 Order 注释。 阅读更多 in the Javadoc .

我的问题是在我的案例中使用 Order 注释没有帮助。请注意,我所有的元素在其名称上都有一个前缀 - prf:

如果我从所有元素名称中删除 prf 前缀,Order 注释将正常工作,并强制 XML 序列化具有定义的顺序。但是输出元素的名称上不会有前缀。

但我真的需要我的元素在其名称上有前缀,否则我的请求将得到 500 响应。我还必须在我的 XML 输出中具有所需的元素顺序。

有什么解决办法吗?

谢谢

最佳答案

我知道自从您发布此问题以来已经过了很长时间,但是,我想回答您的问题,以防有人遇到同样的问题。我通过执行以下操作解决了同样的问题:

对于要按照您想要的顺序使用元素准备的 XML 文档,如果元素有前缀,@Order 注释在某些情况下可能不起作用。在您的情况下,每个元素的 @Order 注释中提到的前缀 'prf' 将无法按照您的需要对它们进行排序。

“默认情况下,字段的序列化是按声明顺序完成的。”

我也不相信这一点,尤其是当你有元素前缀的时候。因此,我尝试更改 Java 变量名称。我尝试按照我在生成的 xml 中需要它们的方式按字母顺序命名它们。因此,在您的情况下,您可以按如下方式更改变量名称:

@Root (name = "prf:container")
public class Container {

    @Element (name = "prf:aaa")
    private int element1;

    @Element(name = "prf:bbb")
    private boolean element2;

    @Element (name = "prf:element", required = false)
    private MyElement element3;

    @Element (name = "prf:ccc", required = false)
    private String element4;

}

这将完全按照您的需要形成 xml 文档。您可能想知道,如果我们将变量名称更改得过于通用,它们并不能代表它们实际的含义,但是您始终可以使用 getter 和 setter。例如,在您的情况下,您可以:

public void setAaa(String aaa){
    this.element1 = aaa;
}

public String getAaa(){
    return element1;
}

以同样的方式,您始终可以生成具有按字母顺序排列的变量的类,以确保生成的 xml 具有所需格式的元素。

关于android - @Order 注解对 XML 序列化顺序没有影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35353304/

相关文章:

android - MapFragment 和 Camera 似乎在同一个 Activity 中相互干扰

android - 如何用图像更改 Slider 的拇指 Material Component Android?

java - AndroidManifest.xml - 指定的属性 'manifest' 不存在

php - magento soap api v2 - 通过时事通讯订阅获得客户

android - ffmpeg 失去质量的视频

java - 为 Android 中的应用程序制作半透明状态栏

c# - Visual Studio 2015,缺少库 System.Xml.Linq

xml - 具有多个模板的 XSL

python - 如何用 Python 解析 SOAP XML?

javascript - 如何: wsse soap request in javascript (node)