为JAXB生成的每个类生成唯一的可序列化id

11

我正在使用ant wsimport从WSDL生成客户端存根。此外,我想生成实现Serializable的客户端类。我希望为每个类生成不同的serialVersionUID。我尝试过使用下面显示的绑定文件,但是它为所有类生成相同的serialVersionUID。是否有任何方法可以为每个类提供自己的serialVersionUID

<wsimport xendorsed="true" binding="binding.xml" debug="true" keep="true" 
verbose="false"  sourcedestdir="${generated}" wsdl="${src}${wsdl.file}"
wsdlLocation="${wsdl.file}">
</wsimport>

绑定配置

<bindings xmlns="http://java.sun.com/xml/ns/jaxb" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <globalBindings>   
        <serializable uid="1" />        
    </globalBindings>    
</bindings>

等等…如果您实现了Serializable,那么您就绑定了自己的一生;生成随机UUID? - fge
@fge OP并没有说他想要随机的uid,OP想要不同的uid用于不同的类(即不总是相同/1)。理论上可以根据类的内容生成uid。不同的内容-不同的uid。所以这个问题对我来说是有意义的。 - lexicore
<xjc:serializable uid="1"/> 定制只能在您的 <jaxb:globalBindings> 中进行 请参见此处。无论如何,您可以使用绑定为每个生成的元素添加解决方法。 - Xstian
1
为什么它们需要是唯一的? - jtahlborn
2个回答

3
仅供参考,无法为每个生成的类生成唯一的serialVersionUID,因为这样做没有意义。
让我解释一下:一个serialVersionUID代表了你的类在某个特定时间点上的版本。如果你修改了你的类,你的serialVersionUID应该会改变。所以当JDK反序列化同一类的对象时,它知道将其反序列化到哪个版本的类中。
在JAXB的情况下,由于您每次都会同时生成所有类,因此对所有类进行版本控制是没有意义的。因为它们只能作为一个组进行更改。(除非将它们从目标文件夹中取出...)
希望这能让您更好地理解。

2
这是我们使用的绑定文件,它对我们非常有用。
<xs:schema elementFormDefault="qualified" version="1.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" jaxb:version="2.0"
jaxb:extensionBindingPrefixes="xjc">
<xs:annotation>
    <xs:appinfo>
        <jaxb:globalBindings>
            <xjc:serializable />
        </jaxb:globalBindings>
    </xs:appinfo>
</xs:annotation>


不,这不是完整的模式,而是要插入到您的模式中的相关部分。至少,将这些行插入我的WSDL文件中就可以解决问题了。 - Michael Piefel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接