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