Сериализованный объектный файл пуст, когда в программе нет ошибок

#java #serialization

#java #сериализация

Вопрос:

Я не уверен, почему файл BankAccount.ser пуст после успешного запуска приведенного ниже кода. BankAccount.ser файл — это ресурс пути к классу. После успешного запуска SuccessfulSerializationTestDriver BankAccount.ser на диске находится ноль байтов и не имеет содержимого.

 public class SuccessfulSerializationTestDriver {

    public static void main(String[] args) {

        long accountNumber=12033456;
        String bankName="SBI";
        String branch="NOIDA";

        SerializableBankAccount sBankAccount = new SerializableBankAccount();

        sBankAccount.setAccountNumber(accountNumber);
        sBankAccount.setBankName(bankName);
        sBankAccount.setBranch(branch);

        try(FileOutputStream fileOut =new FileOutputStream("BankAccount.ser")){
            ObjectOutputStream out= new ObjectOutputStream(fileOut);
            out.writeObject(sBankAccount);
            out.flush();
            out.close();
            System.out.println("Bank Account is successfully serialized");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }   

    }

}
 

Сериализуемый класс ,

 public class SerializableBankAccount implements Serializable {

    private static final long serialVersionUID = 1L;
    private long accountNumber;
    private String bankName;
    private String branch;

    public long getAccountNumber() {
        return accountNumber;
    }
    public void setAccountNumber(long accountNumber) {
        this.accountNumber = accountNumber;
    }
    public String getBankName() {
        return bankName;
    }
    public void setBankName(String bankName) {
        this.bankName = bankName;
    }
    public String getBranch() {
        return branch;
    }
    public void setBranch(String branch) {
        this.branch = branch;
    }

    @Override
    public String toString(){
      return accountNumber "," bankName "," branch;
    }
}
 

РЕДАКТИРОВАТЬ: я написал десериализатор, и я успешно получаю объект, так что это просто проблема видимости. Каким-то образом файл отображается с нулевыми байтами.

 public class SuccessfulDeSerializationTestDriver {

    public static void main(String[] args) {
        SerializableBankAccount sBankAccount = null;

        try(FileInputStream fileIn =new FileInputStream("BankAccount.ser")){
            ObjectInputStream inStream= new ObjectInputStream(fileIn);
            sBankAccount= (SerializableBankAccount) inStream.readObject();
            inStream.close();
            System.out.println("Successfully Deserialized Object is " sBankAccount);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

}
 

Успешно десериализованный объект — 12033456, SBI, NOIDA

Комментарии:

1. Вы подтвердили, что файл .ser, который вы просматриваете, создается каждый раз, когда вы запускаете код? Это может быть старый файл, созданный неработающим кодом, препятствующий созданию нового.

Ответ №1:

Если файл, который вы просматриваете, имеет нулевые байты, но он успешно десериализуется, похоже, что файл создается в другом месте. Возможно, для начала укажите путь явно при создании имени файла. Файл размером 0 может быть из более старого запуска — удалите его на диске и посмотрите, будет ли он создан снова.

Комментарии:

1. Да, похоже, это проблема. Я создал файл в разделе ресурсы в проекте, пока я сериализую в корневом каталоге проекта. Файл в корневом каталоге проекта не пуст — его 1 КБ.

Ответ №2:

Я не могу воссоздать проблему, с которой вы столкнулись. Когда я запускаю ваш код, создается файл BankAccount.ser, который не является пустым. На самом деле я написал тест десериализации, чтобы посмотреть, смогу ли я вернуть объект, прочитав файл, и он работает нормально.

Вот класс десериализации на случай, если он вам нужен:

 import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;

public class DeserializationTestDriver {

    public static void main(String[] args) {
        try(FileInputStream fileInput =new FileInputStream("BankAccount.ser")){
            ObjectInputStream input = new ObjectInputStream(fileInput);
            SerializableBankAccount sBankAccount = (SerializableBankAccount) input.readObject();
            input.close();
            System.out.println("Bank Account is successfully deserialized: " sBankAccount.toString());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }   
    }

}
 

Я также добавил toString метод в ваш SerializableBankAccount :

 @Override
public String toString() {
    return "SerializableBankAccount [accountNumber="   accountNumber
              ", bankName="   bankName   ", branch="   branch   "]";
}
 

После запуска вашего кода сериализации и последующей десериализации, приведенной выше, я получаю следующий вывод:

Банковский счет успешно десериализован: SerializableBankAccount [Номер счета = 12033456, имя банкноты = SBI, филиал = NOIDA]

Итак, очевидно, что код в порядке, что означает, что он должен быть как-то связан с окружающей средой. Я предлагаю проверить, используете ли вы программу с правильными привилегиями, разрешениями и т. Д. Кажется, что что-то внешнее по отношению к вашему коду мешает вам записывать в файл. Либо это, либо, возможно, вы просматриваете неправильный файл, убедитесь, что у вас правильный путь, и проверьте даты создания и изменения файла.