Чтобы уточнить ответ Тома Хоутина, мне удалось реализовать его, используя следующий код:
public static ObjectInputStream getSwapOIS( InputStream in ,String fromClass,String toClass)
throws IOException ,ClassNotFoundException {
final String from="^"+fromClass,fromArray="^\\[L"+fromClass,toArray="[L"+toClass;
return new ObjectInputStream(in) {
protected Class<?> resolveClass(ObjectStreamClass desc)
throws IOException, ClassNotFoundException
{
String name = desc.getName().replaceFirst(from, toClass);
name = name.replaceFirst(fromArray, toArray);
return Class.forName(name);
}
protected ObjectStreamClass readClassDescriptor()
throws IOException, ClassNotFoundException
{
ObjectStreamClass cd = super.readClassDescriptor();
String name = cd.getName().replaceFirst(from, toClass);
name = name.replaceFirst(fromArray, toArray);
if(!name.equals(cd.getName())) {
cd = ObjectStreamClass.lookup(Class.forName(name));
}
return cd;
}
};
}
Обратите внимание, что вам также необходимо переопределить readClassDescriptor (). Он работает как для стандартных типов, так и для массивов, и вы даже можете изменить имя класса, а не только имя пакета. Просто сделай:
InputStream in = new ByteArrayInputStream(classBytes);
ObjectInputStream ois = getSwapOIS( in,
"com.oldpackage.className",
"com.newpackage.newClassName");
Object myObject= ois.readObject();