Я читал, что обычно абстрактные классы не следует делать сериализуемыми в Java. Подклассы должны быть сериализуемыми (с настраиваемыми читать, писать методы, если требуется, например, когда в абстрактных классах есть поля).
Какова причина этого? Почему это считается плохим дизайном?
Обновление1: У меня есть абстрактный класс с некоторыми полями и три подкласса. На данный момент я использую следующий подход.
Я сделал все подклассы сериализуемыми с помощью специальных методов чтения и записи. В абстрактном классе у меня есть следующие методы.
void writeFields(ObjectOutputStream out)throws IOException { .... }
void readFields(ObjectInputStream in) throws IOException, ClassNotFoundException{ ... }
В пользовательских методах чтения и записи в подклассах я вызываю эти методы для (де) сериализации полей в абстрактном классе. Это правильный подход? Или есть другой лучший подход?
Обновление 2: Я последовал совету Тома и сделал свой абстрактный класс Serializable. (Я хочу, чтобы все подклассы были сериализуемыми, и у меня есть данные в абстрактном классе). Это отступление, но чтобы завершить рассказ, я использую отражение для изменения конечных полей, как советует Джереми Мэнсон. --- 1440780- Я пытаюсь использовать apache-commons net FTP lib для получения с FTP-сервера. Код работает нормально, если в каталоге всего 1 файл, но всегда возвращает ноль при втором вызове метода retrieveFileStream (). Какие-нибудь мысли? Я написал следующий пример кода, чтобы продемонстрировать свою проблему. public static void main(String[] args) throws Exception
{
String strLine;
FTPClient client = null;
try{
client = new FTPClient();
client.connect("localhost", 21);
client.enterLocalPassiveMode();
client.login("ftptester", "letmein");
client.changeWorkingDirectory("remote");
FTPFile[] ftpFiles = client.listFiles();
if (ftpFiles != null && ftpFiles.length > 0) {
for (FTPFile file : ftpFiles) {
if (!file.isFile()) {
continue;
}
InputStream fin = client.retrieveFileStream(filepath);
if (fin == null) {
System.out.println("could not retrieve file: " + filepath);
continue;
}
byte[] data = readBytes(fin); // helper method not shown, just processes the input stream
fin.close();
fin = null;
System.out.println("data: " + new String(data));
}
}
}
finally {
... // cleanup code
}
}