Почему бы не сериализовать абстрактные классы в Java?

Я читал, что обычно абстрактные классы не следует делать сериализуемыми в Java. Подклассы должны быть сериализуемыми (с настраиваемыми читать, писать методы, если требуется, например, когда в абстрактных классах есть поля).

Какова причина этого? Почему это считается плохим дизайном?

Обновление1: У меня есть абстрактный класс с некоторыми полями и три подкласса. На данный момент я использую следующий подход.

Я сделал все подклассы сериализуемыми с помощью специальных методов чтения и записи. В абстрактном классе у меня есть следующие методы.

void writeFields(ObjectOutputStream out)throws IOException { .... }

void readFields(ObjectInputStream in) throws IOException, ClassNotFoundException{ ... }

В пользовательских методах чтения и записи в подклассах я вызываю эти методы для (де) сериализации полей в абстрактном классе. Это правильный подход? Или есть другой лучший подход?

Обновление 2: Я последовал совету Тома и сделал свой абстрактный класс Serializable. (Я хочу, чтобы все подклассы были сериализуемыми, и у меня есть данные в абстрактном классе). Это отступление, но чтобы завершить рассказ, я использую отражение для изменения конечных полей, как советует Джереми Мэнсон. --- 1440780- apache-commons ftp для получения нескольких файлов Я пытаюсь использовать apache-commons net FTP lib для получения с FTP-сервера. Код работает нормально, если в каталоге только 1 файл, но всегда возвращает null при втором вызове ...

Я пытаюсь использовать 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
    }
  }

7
задан skaffman 18 May 2012 в 15:23
поделиться