我正在尝试使用javax.crypto.Cipher.doFinal(byte[])方法加密一个对象。但是,出于安全原因,该对象不能进行序列化。
那么,如何将对象转换为字节数组而不进行序列化呢?
--更新
使用序列化是使用此Cipher方法的唯一方法吗?因为据我所知,重要数据不应该是可序列化的。
我正在尝试使用javax.crypto.Cipher.doFinal(byte[])方法加密一个对象。但是,出于安全原因,该对象不能进行序列化。
那么,如何将对象转换为字节数组而不进行序列化呢?
--更新
使用序列化是使用此Cipher方法的唯一方法吗?因为据我所知,重要数据不应该是可序列化的。
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();
}
你只需要对它的每个组件进行序列化。递归执行。最终,你会得到可以序列化的本地对象。
如果你通过实现Java的序列化方法来实现这一点,Java将确保你不会重复序列化任何对象,并为你处理引用。
简而言之,使对象可序列化。
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;
}
}
当然,你的情况中很多细节取决于你的类结构,但希望这能让你朝着正确的方向前进。
要进行反序列化,你只需要将上述过程反转即可。
java.beans.XMLEncoder/Decoder。