其他分享
首页 > 其他分享> > android – @Order注释对XML序列化顺序没有影响

android – @Order注释对XML序列化顺序没有影响

作者:互联网

我正在使用带有SimpleXmlConverter的Retrofit 2,我在创建Soap Request Object时面临一个问题,它基本上是一个包含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 Request对象:

@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;

}

根据Simple XML框架文档:

By default serialization of fields is done in declaration order.

但是,在Android中,至少在某些情况下,情况并非如此.无论我如何在Container类中设置字段声明顺序,输出始终具有相同的元素顺序.这是一个已知的错误,正如其他SO帖子中所报道的那样.

尽管如此,这个问题还是有一个解决方案.订单注释.
阅读更多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,soap,xml,retrofit2,simple-framework
来源: https://codeday.me/bug/20190528/1167690.html