2014-01-19 5 views
1

Я пытаюсь сериализовать массив объектов и записать его в файл с именем address.ser, а затем прочитать обратно из файла, десериализовать массив объектов и отобразить его атрибуты. Я попробовал сериализацию всего массива сразу (десериализация его за один сеанс во время чтения), а также попытался последовательно сериализовать каждый объект массива объектов один за другим (десериализация его по одному во время чтения). Проблема в том, что, читая обратно из файла address.ser, я получаю данные только из последнего написанного объекта и никого другого.Сериализация объектов и десериализация с использованием ArrayList в Java

Вот фрагмент кода:

Employee[] a=new Employee[5]; 

    List<Employee> arr=new ArrayList<Employee>(); 

    for(int i=0;i<=4;i++) 
    { 
    a[i]=new Employee(); 
    System.out.println("Enter name,age,height,weight,house_no:"); 
    a[i].name=sc.next(); 
    a[i].age=sc.nextInt(); 
    a[i].height=sc.nextDouble(); 
    a[i].weight=sc.nextDouble(); 
    a[i].house_no=sc.nextInt(); 
    arr.add(a[i]); 
    } 

Это фрагмент кода для записи объектов в address.ser:

for(int i=0;i<=4;i++) 
    { 
    try 
    { 
    fout = new FileOutputStream("e:\\address.ser"); 
    oos = new ObjectOutputStream(fout); 
    oos.writeObject(a[i]); 
    //oos.writeChars("\n"); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
    finally 
    { 
    oos.close(); 
    fout.close(); 
    } 
    } 

Это фрагмент кода для чтения объектов из address.ser:

List<Employee> recordList=new ArrayList<Employee>(); 
    for(int i=0;i<=4;i++) 
    { 
    try 
    { 
     file = new FileInputStream("e:\\address.ser"); 
     input = new ObjectInputStream (file); 

     //deserialize the List 
     Employee readCase=(Employee) input.readObject(); 
     recordList.add(readCase); 
     System.out.print("Employee "+i+" "); 
     System.out.print((recordList.get(i).name)+" "); 
     System.out.print((recordList.get(i).age)+" "); 
     System.out.print((recordList.get(i).height)+" "); 
     System.out.print((recordList.get(i).weight)+" "); 
     System.out.print((recordList.get(i).house_no)+" "); 
     System.out.println(); 

    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
    finally 
    { 
    file.close(); 
    input.close(); 
    } 
    } 

Конечный результат существо:

Output Image

+0

Ваш класс Employee распространяется Serializable объект? –

+0

@BhavikAmbani: Тогда никакие элементы не были бы успешно написаны – blackcompe

ответ

0

Исправленного Решение

Вы перезаписать файл для каждого элемента вы пытаетесь сериализациями. Поэтому последний сериализованный элемент остается. У файла сериализованных данных есть заголовок, поэтому вы должны записать свои данные за один снимок.

fout = new FileOutputStream("e:\\address.ser"); 
oos = new ObjectOutputStream(fout); 
for(int i=0;i<=4;i++) 
{ 
    try 
    { 
     oos.writeObject(a[i]); 
    }catch(Exception e){} 
} 

Однако, это более эффективно сериализовать весь список в одном кадре.

+1

Это быстрое решение не будет работать. Очевидно, вы не пробовали. – EJP

+0

@EJP: Я вижу. Благодарю. http://stackoverflow.com/questions/15607969/appending-objects-to-a-serialization-file – blackcompe

+0

Теперь это просто избыточно. Все, что вам нужно, это writeObject (a). Нет петли. – EJP

0

Проблема в том, что вы пытаетесь написать объект неправильно. Вы пишете каждый элемент ArrayList в одном файле. Итак, что происходит, новый элемент заменяет старый. Так написать весь список в то время Лик

oos.writeObject(yourList); 
1

Это способ сделать,

public class Test { 
    public static void main(String[] args) { 
Employee employee=new Employee("jhon"); 
Employee employee2=new Employee("jojo"); 
Employee employee3=new Employee("albin"); 
ArrayList<Employee> list=new ArrayList<Employee>(); 
list.add(employee); 
list.add(employee2); 
list.add(employee3); 

try { 
    FileOutputStream outputStream=new FileOutputStream("add.ser"); 
    ObjectOutputStream objectOutputStream= new ObjectOutputStream(outputStream); 
    objectOutputStream.writeObject(list); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 


try { 
    FileInputStream inputStream=new FileInputStream("add.ser"); 
    ObjectInputStream objectInputStream =new ObjectInputStream(inputStream); 
    ArrayList<Employee> list2=(ArrayList<Employee>) objectInputStream.readObject(); 
    for (Employee employee4 : list2) { 
     System.out.println(employee4.getName()); 
    } 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
} 
    } 
} 
Смежные вопросы