2014-09-29 4 views
0

У меня есть 2 класса. В первом классе я пишу данные из List, во втором классе, я хочу прочитать эти данные и поместить в listview. Это сохранить данные правильно, но когда я пытаюсь получить его, LogCat дает ошибку:ObjectInputStream не может правильно нарисовать объект

java.lang.ClassCastException: pl.pawelfrydrych.CHAPS.AdapterPlanuProbOnline$podzialPlanu cannot be cast to pl.pawelfrydrych.CHAPS.AdapterPlanuProbOffline$podzialPlanu 
      at pl.pawelfrydrych.CHAPS.AdapterPlanuProbOffline$AdapterDlaPlanu.getView(AdapterPlanuProbOffline.java:115) 

Я не могу понять, почему, потому что всегда я получаю один и тот же тип данных.

Первый метод класса записи:

public void SaveAsFile(List<podzialPlanu> lista){ 
// lista - List<podzialPlanu> podzialPlanuList2 = new ArrayList<podzialPlanu>(); 

     try { 
      FileOutputStream saveFile = new FileOutputStream(Environment.getExternalStorageDirectory().getPath() + "/" + "planProby.sav"); 
      ObjectOutputStream save = new ObjectOutputStream(saveFile); 

      save.writeObject(lista); 

      save.close(); 


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

И главный класс, когда я пытаюсь получить данные из этого файла, и поместить его в мой ListView

public class AdapterPlanuProbOffline extends Activity implements Serializable { 

    List<String> DzienDataList; 
    List<String> GodzinaList; 
    List<String> RodzajList; 
    List<String> ProgramList; 
    List<String> UwagiList; 
    List<String> listaDni; 
    List<String> listaMiesiecy; 
    File plik; 


    public class podzialPlanu implements Serializable{ 
     String DzienData; 
     String Godzina; 
     String Rodzaj; 
     String Program; 
     String Uwagi; 
    } 

    AdapterDlaPlanu nowyAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.listviewy); 



     nowyAdapter = new AdapterDlaPlanu(); 

     ListView listView1 = (ListView) findViewById(R.id.listView1); 
     listView1.setAdapter(nowyAdapter); 

    } 



    public class AdapterDlaPlanu extends BaseAdapter implements Serializable{ 

     List<podzialPlanu> podzialPlanuList = getData(); 

     @Override 
     public int getCount() { 
      return podzialPlanuList.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
      return podzialPlanuList.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

      if(convertView == null){ 
       LayoutInflater inflater = (LayoutInflater) AdapterPlanuProbOffline.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       convertView = inflater.inflate(R.layout.planproby,parent,false); 
      } 



      TextView DzienDataTextView = (TextView) convertView.findViewById(R.id.dzienDataTextView); 
      TextView GodzinaTextView = (TextView) convertView.findViewById(R.id.godzinaTextView); 
      TextView RodzajZajecTextView = (TextView) convertView.findViewById(R.id.rodzajzajecTextView); 
      TextView ProgramTextView = (TextView) convertView.findViewById(R.id.programTextView); 
      TextView UwagiTextView = (TextView) convertView.findViewById(R.id.uwagiTextView); 




/// here is a problem with getData() method 
    DzienDataTextView.setText(getData().get(position).DzienData); 
    GodzinaTextView.setText(getData().get(position).Godzina); 
    RodzajZajecTextView.setText(getData().get(position).Rodzaj); 
    ProgramTextView.setText(getData().get(position).Program); 
    UwagiTextView.setText(getData().get(position).Uwagi); 



      return convertView; 
     } 

     public podzialPlanu getPodzialPlanu(int position){ 
      return podzialPlanuList.get(position); 
     } 
    } 




    public List<podzialPlanu> getData() { 

     List<podzialPlanu> podzialPlanuList2 = new ArrayList<podzialPlanu>(); 
     List< List<String> > listaGlowna = new ArrayList<List<String>>(); 


     for(int i = 0; i < 5; i++) { 
      listaGlowna.add(new ArrayList<String>()); 
     } 

     DzienDataList = new ArrayList<String>(); 
     GodzinaList = new ArrayList<String>(); 
     RodzajList = new ArrayList<String>(); 
     ProgramList = new ArrayList<String>(); 
     UwagiList = new ArrayList<String>(); 
     listaDni = new ArrayList<String>(); 
     listaMiesiecy = new ArrayList<String>(); 

     try { 

      FileInputStream file = new FileInputStream(Environment.getExternalStorageDirectory().getPath() + "/" + "planProby.sav"); 
      ObjectInputStream restore = new ObjectInputStream(file); 

      podzialPlanuList2 = (List<podzialPlanu>) restore.readObject(); 

      restore.close(); 

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

ответ

1

Ну, давайте посмотрим на сообщение об исключении:

java.lang.ClassCastException: 
      pl.pawelfrydrych.CHAPS.AdapterPlanuProbOnline$podzialPlanu 
cannot be cast to 
      pl.pawelfrydrych.CHAPS.AdapterPlanuProbOffline$podzialPlanu 

Вы видите разницу? Обратите внимание, что есть два разных класса podzialPlanu.

Теперь, если метод SaveAsFile в вашем вопросе есть один, который создал сериализации, то отсюда следует, что тип List<podzialPlanu> аргумент на самом деле имея в виду:

pl.pawelfrydrych.CHAPS.AdapterPlanuProbOnline.podzialPlanu 

вместо

pl.pawelfrydrych.CHAPS.AdapterPlanuProbOffline.podzialPlanu 

Yes, so what should I do? If is there serialization, then I can't get this data in another class?

ОК, поэтому настоящая проблема заключается не в сериализации , У вас будет такая же проблема, если вы пропустите шаг serialize/deserialize.

Дело в том, что эти два вложенных класса: не связаны. Вы не можете бросить между несвязанными классами. Таким образом, вы либо должны:

  • использование только один внутренний класс
  • приведение к правильному внутреннему классу или
  • сделать внутренние классы, связанные (например, используя общий интерфейс или суперкласс) и приведение к общему супертип.

Предполагая, что внутренние классы являются public, у вас не должно быть проблем с доступом.

+0

Да, что мне делать? Если есть сериализация, то я не могу получить эти данные в другом классе? – Algeroth

Смежные вопросы