Я занимаюсь разработкой университетского проекта, включающего сериализацию объектов (ресторанов) в файл. Проблема заключается в том, что при исследовании некоторых сериализованных объектов, если их больше 1, исследование не показывает все объекты, которые находятся в «категории» («типология») 2 и 3. Показана категория 1. 1-й блок кода находится в классе A (который реализует Serializable), 2-й - в классе «service». Идея со вторым блоком кода состоит в том, чтобы прочитать файл (если он существует), затем исключить (путем обращения к нулю) те рестораны, которые не соответствуют критерию поиска, а затем заполнить массив теми, которые соответствуют (те, которые являются теперь не NULL) и вернуть его.
Вот код, используемый для сериализации объектов:
private void registraRistorante() {
String filename = "data" + File.separator + "EatAdvisor.dati";
File f = new File(filename);
File directory = new File("data/");
if (!directory.exists()) {
directory.mkdir();
}
if (f.exists() && !f.isDirectory()) {
try {
FileInputStream fileInput = new FileInputStream(filename);
ObjectInputStream in = new ObjectInputStream(fileInput);
Ristoratori[] ristoratoriTemp = (Ristoratori[]) in.readObject();
in.close();
fileInput.close();
Ristoratori[] ristoratori = new Ristoratori[ristoratoriTemp.length + 1];
for (int i = 0; i < ristoratoriTemp.length; i++) {
if (ristoratoriTemp[i].nome.equals(this.nome) && ristoratoriTemp[i].tipoIndirizzo.equals(this.tipoIndirizzo) &&
ristoratoriTemp[i].nomeIndirizzo.equals(this.nomeIndirizzo) &&
ristoratoriTemp[i].civico.equals(this.civico) && ristoratoriTemp[i].comune.equals(this.comune)) {
System.out.println("E' gia' presente un ristorante con questo nome a questo indirizzo.\n");
throw new Exception();
} else {
ristoratori[i] = ristoratoriTemp[i];
}
}
ristoratori[ristoratori.length - 1] = this;
sortRistorantiNome(ristoratori);
FileOutputStream fileOutput = new FileOutputStream(filename);
ObjectOutputStream out = new ObjectOutputStream(fileOutput);
out.writeObject(ristoratori);
out.close();
fileOutput.close();
System.out.println("Dati inseriti con successo!\n");
} catch (Exception e) {
System.out.println("Dati non inseriti");
}
} else {
try {
Ristoratori[] ristoratori = new Ristoratori[1];
ristoratori[0] = this;
FileOutputStream fileOutput = new FileOutputStream(filename);
ObjectOutputStream out = new ObjectOutputStream(fileOutput);
out.writeObject(ristoratori);
out.close();
fileOutput.close();
System.out.println("Dati inseriti con successo!\n");
} catch (Exception e) {
System.out.println("Dati non inseriti");
}
}
}
И код, используемый для исследования ресторанов:
public static Ristoratori[] ricercaTipologia(String tipologia) {
String filename = "data" + File.separator + "EatAdvisor.dati";
File f = new File(filename);
if (f.exists() && !f.isDirectory()) {
try {
FileInputStream fileInput = new FileInputStream(filename);
ObjectInputStream in = new ObjectInputStream(fileInput);
Ristoratori[] ristoratori = (Ristoratori[]) in.readObject();
in.close();
fileInput.close();
int elementiNull = 0;
for (int i = 0; i < ristoratori.length; i++) {
if (!ristoratori[i].getTipologia().equals(tipologia)) {
ristoratori[i] = null;
elementiNull++;
}
}
if (elementiNull == ristoratori.length) {
return null;
} else {
Ristoratori[] ristoratoriOk = new Ristoratori[ristoratori.length - elementiNull];
for (int i = 0; i < ristoratori.length - elementiNull; i++) {
if (ristoratori[i] != null) ristoratoriOk[i] = ristoratori[i];
}
return ristoratoriOk;
}
} catch (Exception e) {
System.out.println("\nQualcosa e' andato storto e non e' stato possibile leggere i dati dei ristoranti.\n");
return null;
}
} else {
return null;
}
}