Способ обработки случая сериализации объекта заключается в реализации собственной инфраструктуры для обработки всего. У вас нет отражения в этом API, но у вас есть «Class.forName ()», который лучше, чем ничего. Вот что я делаю ...
Во-первых, это интерфейс, который есть у каждого реализуемого сериализуемого объекта:
public interface Serializable {
void serialize(DataOutput output) throws IOException;
void deserialize(DataInput input) throws IOException;
}
Метод serialize () записывает поля объекта в экземпляр DataOutput, а метод deserialize () устанавливает поля объекта из экземпляра DataInput. (это оба простые интерфейсы верхнего уровня, используемые ориентированными на данные потоками ввода / вывода, что позволяет мне иметь большую гибкость). Кроме того, любой класс, реализующий этот интерфейс, должен иметь конструктор по умолчанию без аргументов. Конечно, если вы хотите, чтобы ваш сериализованный класс был устойчивым к изменениям, вы можете выбрать соответствующие форматы данных. (например, я реализовал сериализуемую хеш-таблицу как базовый контейнер для обработки этих случаев)
Теперь, чтобы фактически сериализовать класс, реализующий этот интерфейс, у меня есть метод, который выглядит примерно так:
public static byte[] serializeClass(Serializable input) {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
DataOutputStream output = new DataOutputStream(buffer);
try {
output.writeUTF(input.getClass().getName());
input.serialize(output);
} catch (IOException ex) {
// do nothing
}
return buffer.toByteArray();
}
И для десериализации:
public static Serializable deserializeClass(byte[] data) {
DataInputStream input = new DataInputStream(new ByteArrayInputStream(data));
Object deserializedObject;
Serializable result = null;
try {
String classType = input.readUTF();
deserializedObject = Class.forName(classType).newInstance();
if(deserializedObject instanceof Serializable) {
result = (Serializable)deserializedObject;
result.deserialize(input);
}
} catch (IOException ex) {
result = null;
} catch (ClassNotFoundException ex) {
result = null;
} catch (InstantiationException ex) {
result = null;
} catch (IllegalAccessException ex) {
result = null;
}
return result;
}