一. 概述
在开发一些工具的时候, 经常会用到反射, 其中有个方法
Object invoke(Object obj, Object... args)
, 参数里有很多对象参数, 如果我们想预先把参数保存下来, 之后就方便执行了, 应用场景: 例如推送数据失败重推. 本文将介绍如何把把对象转成字符串保存到数据库
二. 代码
2.1 编写工具类
import javax.xml.bind.DatatypeConverter;
class ObjectUtil {
/**
* 把对象转成字符串
*/
public static String objectToString(Object obj) {
// 对象转字节数组
AtomicReference<String> str = new AtomicReference<>();
Optional.ofNullable(obj).ifPresent(o -> {
try {
byte[] bytes = writeObj(o);
str.set(DatatypeConverter.printBase64Binary(bytes));
} catch (Exception e) {
e.printStackTrace();
}
});
return str.get();
}
/**
* 解析字符串为对象
*/
public static Object stringToObject(String str) {
AtomicReference<Object> obj = new AtomicReference<>();
Optional.ofNullable(str).ifPresent(s -> {
try {
byte[] bytes = DatatypeConverter.parseBase64Binary(str);
obj.set(readObj(bytes));
} catch (Exception e) {
e.printStackTrace();
}
});
return obj.get();
}
/**
把对象转为字节数组
*/
public static byte[] writeObj(Object obj) throws Exception {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream outputStream = new ObjectOutputStream(byteArrayOutputStream);
outputStream.writeObject(obj);
outputStream.close();
return byteArrayOutputStream.toByteArray();
}
/**
把字节数组转为对象
*/
public static Object readObj(byte[] bytes) throws Exception {
ObjectInputStream inputStream = null;
try {
inputStream = new ObjectInputStream(new ByteArrayInputStream(bytes));
return inputStream.readObject();
} finally {
inputStream.close();
}
}
}
2.1 测试
import javax.xml.bind.DatatypeConverter;
public class Test{
@Test
public void ObjectToString(){
// 声明一个对象
HelloWorld hello= new HelloWorld();
// 把对象转成字符串
String str = ObjectUtil.objectToString(hello) ;
// 解析字符串为对象
hello = (HelloWorld)ObjectUtil.stringToObject(str)
}
}
网友评论