Java XML-RPC和原始类型

Java XML-RPC和原始类型,java,generics,xml-rpc,Java,Generics,Xml Rpc,我一直在研究XML-RPC在Java中的实现。主要的开源库(例如Apache XML-RPC)使用原始类型来表示Java中的某些XML-RPC类型,例如,结构表示为原始映射 Java不鼓励新代码中的原始类型。联合联络小组 只允许使用原始类型作为对遗留代码兼容性的让步。强烈反对在Java编程语言中引入泛型之后编写的代码中使用原始类型。Java编程语言的未来版本可能会禁止使用原始类型 但是,由于结构的性质,在这种情况下,原始类型不可避免吗?给出了结构的XML-RPC示例: <struct>

我一直在研究XML-RPC在Java中的实现。主要的开源库(例如Apache XML-RPC)使用原始类型来表示Java中的某些XML-RPC类型,例如,结构表示为原始映射

Java不鼓励新代码中的原始类型。联合联络小组

只允许使用原始类型作为对遗留代码兼容性的让步。强烈反对在Java编程语言中引入泛型之后编写的代码中使用原始类型。Java编程语言的未来版本可能会禁止使用原始类型


但是,由于结构的性质,在这种情况下,原始类型不可避免吗?

给出了结构的XML-RPC示例:

<struct>
  <member>
    <name>submitter</name>
    <value><string>Deep Thought</string></value>
  </member>
  <member>
    <name>answer</name>
    <value><i4>42</i4></value>
  </member>
</struct>

提交人
深思熟虑
回答
42
。。。和阵列:

<array>
  <data>
    <value><string>Don't Panic</string></value>
    <value><boolean>0</boolean></value>
    <value><dateTime.iso8601>19791012T12:24:42</dateTime.iso8601></value>
  </data>
</array>

不要惊慌
0
19791012T12:24:42
您可以看到,根据规范,它们可以在同一结构中混合数据类型。这是泛型通常要避免的事情。由于XML-RPC支持的数据类型非常广泛,与所有类型兼容的唯一常见超类最终都是可靠的、旧的,
java.lang.Object
——与您从原始集合中获得的类型相同

从技术上讲,我认为你的问题的答案是:,原始类型并非完全不可避免。但是,由于
java.lang.Object
是最大的公分母,因此更改Java5之前的API可能没有什么实际优势,因为原始集合类型提供了
Object

为了便于讨论,让我们看看引入泛型可以做些什么。首先,几乎可以肯定,这是一个破坏API的更改(与二进制API不兼容),代码使用了库的早期版本(例如Apache的实现)

接下来,结构将从原始的
Map
更改为在这种情况下泛型所能达到的最佳状态:
Map
。一开始,您就不需要为了确定是否关心关联的值而将键投射到
String
。但是,基于程序逻辑,在大多数非平凡的情况下,该值仍然需要一些转换

与struct类似,XML-RPC数组可以从原始的
列表
切换到
列表
,但这实际上对程序逻辑没有影响。没有额外的元数据(如结构的
字符串
字段名)使这一点更有优势

更糟糕的是,这两种数据结构可以嵌套在彼此内部。因此,从一个映射值(或数组/列表元素)获得的
对象可以是另一个
列表
映射
——在这种情况下,即使分别对
列表
映射
进行强制转换,也会发出大量
未经检查的强制转换
警告

就实用性而言,就处理或内省任意XML-RPC数据结构的API而言,yes原始类型可能是不可避免的。或者不值得避免。(在许多方面,考虑到编译时类型擦除,反射和序列化也是一个类似的挑战。)

现在,一个一线希望是,这些库有可能支持将这些非常通用的XML-RPC数据结构编组到您为特定应用程序定义的特定强类型类,或从中编组。但如果您有一个支持该路由的库,希望您不再直接处理结构/数组表示。(如果是,希望您的数据模型不会在同一个“数组”中混合不同的值类型。)


我希望这会有所帮助。

给出了结构的XML-RPC示例:

<struct>
  <member>
    <name>submitter</name>
    <value><string>Deep Thought</string></value>
  </member>
  <member>
    <name>answer</name>
    <value><i4>42</i4></value>
  </member>
</struct>

提交人
深思熟虑
回答
42
。。。和阵列:

<array>
  <data>
    <value><string>Don't Panic</string></value>
    <value><boolean>0</boolean></value>
    <value><dateTime.iso8601>19791012T12:24:42</dateTime.iso8601></value>
  </data>
</array>

不要惊慌
0
19791012T12:24:42
您可以看到,根据规范,它们可以在同一结构中混合数据类型。这是泛型通常要避免的事情。由于XML-RPC支持的数据类型非常广泛,与所有类型兼容的唯一常见超类最终都是可靠的、旧的,
java.lang.Object
——与您从原始集合中获得的类型相同

从技术上讲,我认为你的问题的答案是:,原始类型并非完全不可避免。但是,由于
java.lang.Object
是最大的公分母,因此更改Java5之前的API可能没有什么实际优势,因为原始集合类型提供了
Object

为了便于讨论,让我们看看引入泛型可以做些什么。首先,几乎可以肯定,这是一个破坏API的更改(与二进制API不兼容),代码使用了库的早期版本(例如Apache的实现)

接下来,结构将从原始的
Map
更改为在这种情况下泛型所能达到的最佳状态:
Map
。一开始,您就不需要为了确定是否关心关联的值而将键投射到
String
。但是,基于程序逻辑,在大多数非平凡的情况下,该值仍然需要一些转换

与struct类似,XML-RPC数组可以从原始的
列表
切换到
列表
,但这实际上对程序逻辑没有影响。没有额外的元数据(如结构的
字符串
字段名)使这一点更有优势

更糟糕的是,这两种数据结构可以嵌套在彼此内部。因此,从一个映射值(或数组/列表元素)获得的
对象可以是另一个
list
map
——在这种情况下,甚至可以分别转换为
list
map