Десериализовать байтовый массив в класс, имя которого задано как String - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть данные, которые сериализуются из объекта Java (могут быть разные типы объектов), у меня также есть полное имя класса для типа сериализованных данных в формате String.Теперь я хочу универсальный метод (не универсальный уже работает), которому я передам имя класса в формате String и данные байтового массива, а взамен он вернет десериализованный объект класса.чем-то похожим на подпись ниже

public <T> T convertByteArrayToObject(String className, byte[] data);

например, если я передам convertByteArrayToObject("java.lang.String", [65, 66, 67]);

, тогда он должен вернуть «ABC» как объект String (но также должны быть применимы пользовательские типы).

Спасибо

1 Ответ

0 голосов
/ 26 сентября 2018

Подумайте об этом, вам нужен универсальный метод - чтобы он мог обеспечить безопасность типов во время компиляции , но у вас есть только className во время выполнения;это просто невозможно, или вы действительно не понимаете проблему.Вы можете сделать вид, что он универсальный, например:

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);
}

Но это приведение бесполезно, и ваш метод действительно возвращает просто Object, так что вы можете назначить это в вызывающих программах как угодно:

Integer s = convertByteArrayToObject("java.lang.String", new byte[] { 65, 6, 67 });

Так что этот будет компилироваться просто отлично , создавая ложное впечатление о безопасности типов.С другой стороны, вызывающие абоненты, во время выполнения , потерпят неудачу;поскольку внутри их байтового кода есть checkcast вызовы.Придерживайтесь всего, что у вас есть, и делайте надлежащие проверки.

...