【发布时间】:2018-09-26 11:51:41
【问题描述】:
我有从 java 对象序列化的数据(可以有不同类型的对象),我还有字符串格式的序列化数据类型的完全限定类名。 现在我想要一个泛型方法(非泛型已经工作),我将向其传递字符串格式的类名和字节数组数据,作为回报,它将返回反序列化的类对象。有点类似于下面的签名
public <T> T convertByteArrayToObject(String className, byte[] data);
例如,如果我通过convertByteArrayToObject("java.lang.String", [65, 66, 67]);
那么它应该返回“ABC”作为字符串对象(但自定义类型也应该适用)。
谢谢
【问题讨论】:
-
然后你必须实现那个方法,就像你实现从任意对象创建字节数组的另一个方法一样。
-
我认为你可以这样做
public static <T> T convertByteArrayToObject(String className, byte[] data) throws Exception { Constructor<?> c = Class.forName(className).getConstructor(byte[].class); return (T) c.newInstance(data); };但是投到T很好,没用。我不认为这是以通用方式可行的,因此您在编译时就知道您的类型;我的意思是你在运行时知道className -
@Holger 但这仍然不可能以通用方式对吗?我的意思是
className的类型仅在运行时才知道,我认为没有办法在编译时强制执行此操作 -
@Eugene 你可以声明一个像
public <T> T convertByteArrayToObject(Class<T> expectedType, byte[] data)这样的方法,但不清楚方法中的魔法应该如何工作。如果我事先知道预期的类型(在编译时),我可以写,例如new String(byteArray)首先。并不是说建议使用默认字符集…… -
@Holger 好吧,OP 直到运行时才知道该类,我想这就是它通过
className的原因,还不知道Class<T>并且魔法可能只是触发构造函数,如果有的话
标签: generics java-8 deserialization