我正在尝试使用javax.crypto.Cipher.doFinal(byte [])方法来加密对象。但是,出于安全原因,该对象无法序列化。 那么,如何在没有序列化的情况下将对象转换为字节数组?
- 更新
使用序列化是使用此Cipher方法的唯一方法吗?因为据我所知,重要数据不应该是可序列化的。
答案 0 :(得分:0)
您只需序列化每个组件。递归。最终,您最终会得到可以序列化的本机对象。
如果通过实现java的序列化方法来实现它,java将确保您不会对任何对象进行两次序列化,并会为您处理引用。
简而言之,将对象序列化。
答案 1 :(得分:0)
这是一个将类序列化为字节数组的简单示例。
public Class Foo {
private boolean isHappy;
private short happyCount;
private Bar bar;
public byte[] serializeData () throws IOException
{
ByteArrayOutputStream stream = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream( stream );
out.writeBoolean(isHappy);
out.writeShort( slope );
// Serialize bar which will just append to this byte stream
bar.doSerializeData(out);
// Return the serialized object.
byte[] data = stream.toByteArray();
// Clean up.
stream.close();
return data;
}
}
当然,你案例中的很多细节都取决于你的班级结构,但希望这会让你指出正确的方向。
要反序列化,您只需要反转上述内容。
答案 2 :(得分:0)
解决, 而不是使用getByteArray()来调用Cipher.doFinal(),我将在类中使用Cipher.doFinal(),使用getEncryptedByteArray()方法;所以我在类中序列化数据而不使类本身可序列化,并且返回结果将被加密。 对此方法的任何异议都将被视为...... :)
答案 3 :(得分:0)
我使用了com.fasterxml.jackson.databind.ObjectMapper。
private static byte[] serialize(Object obj) throws IOException {
ByteArrayOutputStream os = new ByteArrayOutputStream();
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.writeValue(os, obj);
return os.toByteArray();
}
答案 4 :(得分:-1)
java.beans.XMLEncoder中/解码器。