[英]Serializing arbitrary Java objects
目前,我需要序列化任意Java对象,因为我想使用Hash作为哈希表的键。 在阅读了有关默认hashCode
经常创建冲突的各种警告之后,我想通过MessageDigest
切换到哈希以使用替代算法(例如SHA1,...),据说该算法允许更多条目而不会发生冲突。 [作为旁注:我知道即使在这里碰撞也可能早早发生,但我想增加保持无碰撞的可能性。]
为此,我尝试了在StackOverflow帖子中提出的方法。 它使用以下代码来获取MessageDigest
必需的byte[]
:
public static byte[] convertToHashableByteArray(Object obj) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = null;
byte[] byteOutput = null;
try {
out = new ObjectOutputStream(bos);
out.writeObject(obj);
byteOutput = bos.toByteArray();
} catch (IOException io) {
io.printStackTrace();
} finally {
try {
if(out != null) { out.close(); }
} catch(IOException io) {
io.printStackTrace();
}
try {
bos.close();
} catch(IOException io) {
io.printStackTrace();
}
}
return byteOutput;
}
但是,这引起了一个问题,即只有实现可序列serializable
接口的对象才会被序列化/转换为byte[]
。 为了避免这个问题,我在catch
子句中将toString()
应用于给定的obj
,以在所有情况下强制获取byte[]
:
public static byte[] convertToHashableByteArray(Object obj) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = null;
byte[] byteOutput = null;
try {
out = new ObjectOutputStream(bos);
out.writeObject(obj);
byteOutput = bos.toByteArray();
} catch (IOException io) {
String stringed = obj.toString();
byteOutput = stringed.getBytes();
} finally {
try {
if(out != null) { out.close(); }
} catch(IOException io) {
io.printStackTrace();
}
try {
bos.close();
} catch(IOException io) {
io.printStackTrace();
}
}
return byteOutput;
}
但是,这仍然让我感到完全错误。 所以我的问题是,是否有更好的选择将任意对象转换为byte[]
以便能够计算哈希。 最好是一种无需使用其他库即可使用的解决方案,或者使用诸如Apache Commons之类的公认库的解决方案。 (此外,我还接受其他方法来获取任意Java对象的SHA1 / SHA512哈希。)
也许您可以将对象的UUID用作不变的唯一标识符?
这里有很多错...
如果您仍在阅读并且仍然不愿意执行第1点,请回到第1点。然后再次。 然后再次。
最后使用粗麻布序列化来回答您的问题。
http://hessian.caucho.com/doc/hessian-overview.xtp
它与Java语言非常相似,只是输出更快,更短,并且可以对未实现Serializable接口的对象进行序列化(冒着麻烦的危险,您需要设置特殊标志以允许这样做)。
如果您想序列化一个给定的对象,我建议您像这样更改您的方法:
public static byte[] convertToHashableByteArray(Serializable obj){
..........
..........
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.