我将 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/