2015-08-29 3 views
1

Я пытаюсь поместить объект в файл, а затем попытаюсь прочитать один и тот же объект с использованием интерфейса Externalizable, и я получаю исключение. Недействительный конструктор для класса Car.Внешняя структура в java

import java.io.*; 
class Base 
{ 
    int a; 
} 
class Car extends Base implements Externalizable 
{ 
    static int b; 
    String c=""; 

    Car(int d,int e,String f) 
    { 
     a=d; 
     b=e; 
     c=f; 
    } 
    Car() 
{super();} 
     public void writeExternal(ObjectOutput oos) 
     { 
      try 
      { 
      oos.writeInt(a); 
      oos.writeInt(b); 
      oos.writeObject(c); 
      } 
      catch(Exception e){} 
     } 
     public void readExternal(ObjectInput ois) 
     { 
      try 
      { 
      a=ois.readInt(); 
      b=ois.readInt(); 
      c=(String)ois.readObject(); 
      } 
      catch(Exception e){} 
     } 
    } 
    class Main 
    { 
      public static void main(String args[])throws Exception 
     { 
      Car c1=new Car(1,2,"Manish"); 
      FileOutputStream fos=new FileOutputStream("man.txt"); 
      ObjectOutputStream oos=new ObjectOutputStream(fos); 
      oos.writeObject(c1); 
      FileInputStream fis=new FileInputStream("man.txt"); 
      ObjectInputStream ois=new ObjectInputStream(fis); 
      Object o=ois.readObject(); 
      Car c2=(Car)o; 
      System.out.println(c2.a+" "+c2.b+" "+c2.c); 
     } 
    } 

может кто-нибудь объяснить, что такое ошибка?

+0

Почему бы не реализовать сериализуемый? Но чтобы ответить на ваш вопрос, нужен конструктор общедоступного значения по умолчанию, который вызывает супер-конструктор. public Car() {super();} – user

+0

Потому что я изучаю Externalzable. –

ответ

1

Java Serialization предполагает, что у вас есть стандартный конструктор по умолчанию.

Некоторые библиотеки не делают этого предположения, но встроенная сериализация делает.

BTW Вы не должны игнорировать исключения, если не уверены, что это безопасно. В вашем случае вам не нужно их ловить.

public void writeExternal(ObjectOutput oos) throws IOException { 
    oos.writeInt(a); 
    oos.writeInt(b); 
    oos.writeObject(c); 
} 
+0

Но это не решение. Я получаю исключение, вы можете объяснить, почему я получаю его и как его удалить. Исключение составляет в этой строке Object o = ois.readObject(); –

+1

@ManishKumar '" Java Serialization предполагает, что у вас есть стандартный конструктор по умолчанию. "' => У вас должен быть открытый конструктор. Добавьте 'public' к вашему конструктору по умолчанию и вашему классу. Это не работает на 'readObject()', потому что это тот метод, который обнаруживает, что он не может вызвать ваш конструктор по умолчанию, поскольку он не является общедоступным. –

1

Основная проблема является простым фактом: Externalization интерфейса работает через сам объект, чтобы обеспечить сериализации.

Это означает, что сам объект несет ответственность за сохранение и восстановление своего состояния, а это означает, что объект должен существовать, чтобы десериализовать состояние внутри себя (через readExternal).

Что происходит под капотом, так это то, что механизм сериализации выделяет пустой экземпляр объекта, а затем вызывает на нем readExternal.

Так в основном то, что происходит что-то вроде:

Car emptyCar = Car.class.newInstance(); 
emptyCar.readExternal(state); 

Поскольку это происходит из пакета, отличного от один Car проживает и Car() имеет default видимости, двигатель не может вызвать конструктор по умолчанию, следовательно, ошибка.

Вы должны указать конструктор по умолчанию public.

+0

Thanx bro. Это было действительно полезно. –