Java 序列化到“的字节数组”;“相同”;对象在单独的JVM上产生不同的结果

Java 序列化到“的字节数组”;“相同”;对象在单独的JVM上产生不同的结果,java,serialization,data-integrity,Java,Serialization,Data Integrity,我有一个可串行化的数据结构,我将它传输到远程机器,我正试图使用md5哈希来验证远程数据的完整性 我注意到,即使数据看起来相同,哈希值也不匹配 为了计算散列,我使用apache将对象(在本地和远程机器上)转换为字节数组 SerializationUtils.serialize() 深入研究后,我发现字节数组不匹配。 它们非常相似,但不完全相同 有人能解释为什么会这样吗 编辑: 请参阅下面的代码 我简化了数据结构,但类型是相同的(我只是假设问题与类型有关) //md5计算 公共哈希代码哈希(Iter

我有一个可串行化的数据结构,我将它传输到远程机器,我正试图使用md5哈希来验证远程数据的完整性

我注意到,即使数据看起来相同,哈希值也不匹配

为了计算散列,我使用apache将对象(在本地和远程机器上)转换为字节数组 SerializationUtils.serialize()

深入研究后,我发现字节数组不匹配。 它们非常相似,但不完全相同

有人能解释为什么会这样吗

编辑

请参阅下面的代码

我简化了数据结构,但类型是相同的(我只是假设问题与类型有关)

//md5计算
公共哈希代码哈希(Iterable主机备份){
Hasher-Hasher=Hashing.md5().newHasher();
用于(MyObject主机:主机备份){
putBytes(SerializationUtils.serialize(host));
}
返回hasher.hash();
}
//数据结构
公共类MyObject实现可序列化{
私有最终弦肌对象;
私有最终映射aMap;//映射实现是HashMap
私人最终地图;
私人最终地图cMap;
}
公共类StringId实现可序列化{
私有最终字符串ip;
}
公共类LongId实现了可序列化{
私人最终长id;
}
公共类ClassA实现了可序列化{
私有最终StringId id;
私有最终可序列化值;
私人最终很长时间;
}
公共类ClassB实现了可序列化{
私有最终longidID1;
私有最终longidID2;
私有最终结果;//枚举
私人最终很长时间;
}
公共类ClassC实现了可序列化{
私有最终StringId id1;
私有最终longidID2;
私有最终字符串s1;
私有最终字符串s2;
私有最终布尔aBoolean;
}
公共枚举结果{}

能否显示更多的代码?两台机器上的代码版本是否相同?请发布一个。主要的一点是ObjectOutputStream不能保证每次编写对象时输出都是相同的,因此您不能期望它。如果您想更多地了解您的具体情况,您应该发布您的代码。作为类比,不同的JSON编写器在语义相同的输出中包含不同的空格或不包含空格是完全有效的。@Erwin请查看编辑问题中的代码
// md5 calculation
public HashCode hash(Iterable<MyObject> hostBackups) {
    Hasher hasher = Hashing.md5().newHasher();
    for (MyObject host : hostBackups) {
        hasher.putBytes(SerializationUtils.serialize(host));
    }
    return hasher.hash();
}

// data structures
public class MyObject implements Serializable {
    private final StringId myObjectId;
    private final Map<StringId, ClassA> aMap;   // map implementation is HashMap
    private final Map<LongId, ClassB> bMap;
    private final Map<LongId, ClassC> cMap;

}

public class StringId implements Serializable {
    private final String ip;
}

public class LongId implements Serializable {
    private final long id;
}

public class ClassA implements Serializable {
    private final StringId id;
    private final Serializable value;
    private final long time;

}

public class ClassB implements Serializable {
    private final LongId id1;
    private final LongId id2;
    private final Result result;    // enum
    private final long time;
}

public class ClassC implements Serializable {
    private final StringId id1;
    private final LongId id2;
    private final String s1;
    private final String s2;
    private final boolean aBoolean;
}

public enum Result {}