为Java类生成SerialVersionUID

时间:2012-12-19 09:32:46

标签: serialization code-generation

从标题来看,它应该是同一个老问题,但请相信我,这是不同的。

我正在使用EJB3,当然如果我必须远程调用它,我必须使我的所有数据对象都实现Serializable接口。

问题是我的大多数数据对象都是生成的(使用Velocity Templates),一次编译和打包。现在我在每个类中硬编码默认的serialVersionUID,如下所示;

private static final long serialVersionUID = 1L;

但我想知道我是否有办法跟随他人;

private static final long serialVersionUID = getSerialUID();
private static long getSerialUID() {
    // Serial Version Algo code here
}

另外,使用Default serialVersionUID有什么问题吗?我真的需要使用Algo生成一个唯一的ID吗?

2 个答案:

答案 0 :(得分:1)

  1. 使用默认serialVersionUID有什么问题吗?

    使用默认serialVersionUID没有问题,除非你有超过 同一类的一个版本。

    读: What is a serialVersionUID and why should I use it?

  2. 我真的需要使用Algo生成一个唯一的ID吗?

    答案会再次没有。您不必使用任何Algo生成唯一ID。如果您有相同类的不同版本,则可以提供唯一的编号serialVersionUID(例如serialVersionUID = 123和serialVersionUID = 456)

  3. 我强烈建议您浏览Javadoc java.io.Serializable

答案 1 :(得分:1)

第一个答案很有帮助,但它没有告诉您如何生成类serialVersionUID。我已经完成了如下操作,因为我的所有类都是由Velocity Template生成的,我必须在代码生成时获取它。所以我创建了一个方法来获取所有属性的hashcode()并在最后添加它们以获取serialVersionUID。例如;

public int getSerialVerionUID() {
    return getName().hashCode() + 
        getTypeName().hashCode() +
        getCardinality().hashCode() +
        getComplexity().hashCode();
}

因此,只要任何属性发生变化,我们就会拥有不同的UID,而这正是我们所寻求的。

希望这有助于某人。