0

我的目标:将一个 ArrayList 保存到一个 .dat 文件中,读取此文件并最终打印此数组。

为了保存 ArrayList,“equipas”是一个 ArrayList<Equipa>,我使用这个函数:

saveMyFile("Equipas.dat", (Object) equipas);

读书:

public static ArrayList<Equipa> readMyFile(String s){
  ArrayList<Equipa> novo = new ArrayList<Equipa>();
  try {  
      ObjectInputStream ois = new ObjectInputStream(new FileInputStream(s));
      novo = (ArrayList<Equipa>) ois.readObject();
      ois.close();
      }
      catch(IOException er) { System.out.println(er.getMessage()); }
      catch(ClassNotFoundException er) { System.out.println(er.getMessage()); }


  return novo;}

在这个读取函数中,我有一个编译警告:“...使用未经检查或不安全的操作。使用 - Xlint:unchecked 重新编译以获取详细信息。”

保存:

public static void saveMyFile(String s, Object o)
{
  try  {
    ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream(s));
    oos.writeObject(o);
    oos.flush();
    oos.close();
  }
  catch(IOException e) { System.out.println(e.getMessage()); }
}

最后,我想打印 ArrayList 的信息:

ArrayList<Equipa> cena = new ArrayList<Equipa>();
cena=(ArrayList<Equipa>) readMyFile("Equipas.dat");
for(Equipa e:cena)
e.toString();

尝试运行时出错:“正在写入中止;java.io.NotSerializableException: Equipa”

Equipa 具有可序列化:

import java.util.*;
import java.io.*;

public class Equipa implements Serializable
{
private String nome;
private Carro carro;
private ArrayList<Piloto> pilotos;
private double tempoDecorrido; 
private int pontos; 
private boolean desistiu; 
private int voltaDesistencia; 
private Piloto piloto;


/**
 * Constructor for objects of class Equipa
 */
public Equipa()
{
    this.nome = "NA";
    this.carro = null;
    this.pilotos = new ArrayList<Piloto>();
    this.tempoDecorrido = 0;
    this.pontos = 0;
    this.desistiu = false;
    this.voltaDesistencia = 0;
    this.piloto = null;
}

public Equipa(String nome, Carro carro, ArrayList<Piloto> pilotos)
{
    this.nome = nome;
    this.carro = carro;
    //this.pilotos = new ArrayList<Piloto>(pilotos);
    this.pilotos = pilotos;
    this.tempoDecorrido = 0;
    this.pontos = 0;
    this.desistiu = false;
    this.voltaDesistencia = 0;
    //this.piloto = pilotos.get(0);
}

public Equipa (Equipa e)
{
    this.nome = e.getNome();
    this.carro = e.getCarro();
    this.pilotos = e.getPilotos();
    this.tempoDecorrido = e.getTempoDecorrido();
    this.pontos = e.getPontos();
    this.desistiu = e.getDesistiu();
    this.voltaDesistencia = e.getVoltaDesistencia();
    //this.piloto = e.getPiloto();
}

/** Getters */

public String getNome()
{
    return this.nome;
}

public Carro getCarro()
{
    return this.carro;
}

public ArrayList<Piloto> getPilotos()
{
    return new ArrayList<Piloto>(this.pilotos);
}

public double getTempoDecorrido()
{
    return this.tempoDecorrido;
}

public int getPontos()
{
    return this.pontos;
}

public boolean getDesistiu()
{
    return this.desistiu;
}

public int getVoltaDesistencia()
{
    return this.voltaDesistencia;
}

public Piloto getPiloto()
{
    return this.piloto;
}

/** Setters */

public void setNome(String nome)
{
    this.nome = nome;
}

public void setCarro(Carro carro)
{
    this.carro = carro;
}

public void setPilotos(ArrayList<Piloto> pilotos)
{
    this.pilotos = new ArrayList<Piloto>(pilotos);
}

public void setTempoDecorrido(double tempoDecorrido)
{
    this.tempoDecorrido = tempoDecorrido;
}

public void setPontos(int pontos)
{
    this.pontos = pontos;
}

public void setDesistiu(boolean desistiu)
{
    this.desistiu = desistiu;
}

public void setVoltaDesistencia(int voltaDesistencia)
{
    this.voltaDesistencia = voltaDesistencia;
}

public void setPiloto(Piloto piloto)
{
    this.piloto = piloto;
}

/** Outros Métodos */

public Equipa clone()
{
    return new Equipa(this);
}

public boolean equals(Equipa e)
{
    if(this.nome == e.getNome())
        return true;
    else 
        return false;
}

public String getStringPilotos()
{
    String s = new String();
    for(Piloto p: this.pilotos)
        s = (s + ", " + p.getNome());
    return s;
}

public String toString()
{
   return new String("Nome da equipa: " + nome + "; Categoria do carro: " + carro.getClass().getName() + "; Marca e modelo: "  + carro.getMarca() + " " + carro.getModelo() + "; Pilotos: " + getStringPilotos())+"\n";
}
4

3 回答 3

1

实现 Serializable 意味着允许序列化,但不一定是可能的。为了使其工作,Equipa 引用的所有内容也必须是原始的或可序列化的(以此类推,递归的)。是这样吗?

于 2013-05-27T10:51:05.767 回答
0

读取函数中的警告是 java 中泛型的结果。你将无法抑制它,除非你@SuppressWarnings("unchecked")习惯于忽略它。

如果您确定您正在阅读ArrayList<Equipa>,则可以毫无问题地忽略它。

通过Equipa代码,我可以尝试指出Serializable问题所在:确保CarroPiloto类也是Serializables. 如果不确定,可以添加这些类的代码。

于 2013-05-27T11:00:42.923 回答
0

唯一类型更安全的方法是进行自定义序列化,在类上使用writeObject(OutputStream)readObjectInputStreamArrayListOfEquipa可能使用Equipa[]( ArrayList.toArray())。

不是很有吸引力,如果警告是唯一的原因。

于 2013-05-27T11:25:16.853 回答