2013-05-27 149 views
0

我的目標:將一個ArrayList保存到一個.dat文件中,讀取此文件並在最後打印此數組。Java警告和錯誤(讀取對象)

要保存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重新編譯:取消選中以查看詳細信息。」

爲了節省:

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 havs the Serializable:

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"; 
} 
+0

問題肯定在'Equipa'類中。請顯示代碼。 – eternay

+0

我將Equipa類添加到問題中。 –

+0

「Carro」和「Piloto」呢?他們也是'Serializable'嗎? –

回答

1

實現可序列化意味着允許序列化,但不一定這是可能的。爲了使它工作,Equipa引用的所有東西都必須是原始的或者可序列化的(等等,遞歸地)。是這樣嗎?

+0

是的,可序列化在所有類中。閱讀功能的警告? –

0

read函數中的警告是java中泛型的結果。除非您使用@SuppressWarnings("unchecked")來忽略它,否則您將無法取消它。

如果您確定自己正在閱讀ArrayList<Equipa>,您可以忽略它,而不會有任何問題。

隨着Equipa代碼,我可以嘗試指向Serializable問題:確保CarroPiloto類也Serializables。如果您不確定,您可以添加這些類的代碼。

+0

我將Equipa類添加到問題中。 –

+0

public abstract class Carro implements Serializable {...} public class Piloto implements Serializable {...} –

+0

只要確保這些類中包含的每個屬性都是'Serializable'。 – eternay

0

唯一的類型安全的方法是做一個自定義serialization,使用writeObject(OutputStream)readObjectInputStream一類ArrayListOfEquipa說也許使用Equipa[]ArrayList.toArray())。

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