Generics 将字节数组反序列化为名称为字符串的类

Generics 将字节数组反序列化为名称为字符串的类,generics,java-8,deserialization,Generics,Java 8,Deserialization,我有从java对象序列化的数据(可以有不同类型的对象),我还有字符串格式的序列化数据类型的完全限定类名。 现在我需要一个泛型方法(非泛型方法已经在工作),我将向其传递字符串格式的类名和字节数组数据,作为回报,它将返回反序列化的类对象。有点像下面的签名 public <T> T convertByteArrayToObject(String className, byte[] data); public T convertByteArrayObject(字符串类名,字节[]数据);

我有从java对象序列化的数据(可以有不同类型的对象),我还有字符串格式的序列化数据类型的完全限定类名。 现在我需要一个泛型方法(非泛型方法已经在工作),我将向其传递字符串格式的类名和字节数组数据,作为回报,它将返回反序列化的类对象。有点像下面的签名

public <T> T convertByteArrayToObject(String className, byte[] data);
public T convertByteArrayObject(字符串类名,字节[]数据);
例如,如果我传递
convertByteArrayToObject(“java.lang.String,[65,66,67])

然后它应该返回“ABC”作为字符串对象(但是自定义类型也应该适用)


谢谢

想想看,您需要一个泛型方法——这样它可以在编译时强制执行某种类型安全性,但在运行时您只有
类名
;这是根本不可能的,或者你根本不了解问题所在。您可以假装它是通用的,例如:

public static <T> T convertByteArrayToObject(String className, byte[] data) throws Exception {
    Class<?> clazz = Class.forName(className);
    Constructor<?> c = clazz.getConstructor(byte[].class);
    return (T) c.newInstance(data);
}

所以这会很好的编译,给你一个类型安全的假象。另一方面,调用方在运行时将失败;因为在它们的字节码中有
checkcast
调用。坚持你所拥有的一切,并进行适当的检查

然后你必须实现这个方法,就像你实现另一个从任意对象创建字节数组的方法一样。我认为你可以这样做
public static T convertByteArrayToObject(String className,byte[]data)抛出异常{Constructor c=Class.forName(className).getConstructor(byte[].class);返回(T)c.newInstance(数据);}
;但是对
T
的转换是好的,没有用的。我认为这在一般情况下是不可行的,这样您就可以在编译时知道自己的类型;我的意思是你知道运行时的
类名
anyway@Holger但这在一般情况下仍然是不可能的,对吗?我的意思是,
className
的类型只有在运行时才知道,我看不到在编译时实现这一点的方法time@Eugene您可以声明一个方法,如
public T convertByteArrayToObject(类expectedType,字节[]数据)
,但不清楚该方法内部的魔力是如何工作的。如果我事先(在编译时)知道预期的类型,我可以首先编写,例如
newstring(byteArray)
。并非建议依赖默认字符集…@Holger好吧,OP直到运行时才知道类,我想这就是为什么它传递
类名
,还不知道
,魔法可能只是触发构造函数,如果可以的话,我理解你的观点。但是如果T/className的所有可能值都能实现可序列化接口,这会有区别吗?@Jayesh不幸的是,不,你可以声明
,擦除后它将是
可序列化的
,但这对你没有多大帮助。谢谢@Eugene,我理解了你试图在这里解释的概念。所以我所做的就是创建了一个自定义标记接口,所有我想要反序列化的类都必须实现这个接口。现在我知道,在编译时,它需要反序列化到哪个类。然后我使用
instanceof
check进行类型转换,以更正类。这对我很有用。
Integer s = convertByteArrayToObject("java.lang.String", new byte[] { 65, 6, 67 });