2013-09-11 5 views
0

После выполнения приведенного ниже кода значения, которые печатаются, являются нулевыми для строк. Зачем? (Конечно, я написал объект в файл). Может ли кто-нибудь помочь мне в этом отношении?Чтение объекта из файла в java

class Demo { 
    protected String name; 
    protected String address; 
} 

class Demo1 extends Demo implements Serializable 
{ 
    transient int age; 
    Demo1(String name,String address,int age) 
    { 
     this.name=name; 
     this.address=address; 
     this.age=age; 
    } 
} 
public class FileRead 
{ 
    public static void main(String args[]) 
    { 
     Demo1 ob=new Demo1("Rose","Rohini",23); 
     try 
     { 
      FileInputStream fileIn = new FileInputStream("Demo.ser"); 
      ObjectInputStream in = new ObjectInputStream(fileIn); 
      ob = (Demo1) in.readObject(); 
      in.close(); 
      fileIn.close(); 
     }catch(IOException i) 
     { 
      i.printStackTrace(); 
      return; 
     } 
     catch(ClassNotFoundException c) 
     { 
      System.out.println("Demo class not found"); 
      c.printStackTrace(); 
      return; 
     } 
     System.out.println("Deserialized Details..."); 
     System.out.println("Name: " + ob.name); 
     System.out.println("Address: " + ob.address); 
     System.out.println("age " + ob.age); 
    } 
} 
+1

'У меня проблема с чтением объекта' Исключение? Ошибка ? –

+0

У вас есть вопросы? –

+0

Что такое '' Demo.ser ''?? Это ваше имя? –

ответ

1

Вы объявили поле «TRANSIENT». Поле переходных процессов не будет сериализовано. При восстановлении объекта они будут иметь значение по умолчанию. Для жалит это нуль

Update сделана после того, как оклейка демо кода класса

Fix: Ваш демонстрационный класс должен быть

class Demo implements Serializable { 
    protected String name; 
    protected String address; 
} 

Если вы хотите возраст также сериализовать затем изменить переходной Int возраста; -> int age;

+2

его только возраст преходящий? Не следует указывать значение null для остальных, если класс demo не содержит переходы – Marthin

+0

Поскольку код демонстрации не вставлен, я предполагаю, что даже в Demo поля будут объявлены переходными. Это одна из причин того, что поля имеют значения по умолчанию при восстановлении. – upog

+0

Почему вы не можете предположить, что файл OP является де-сериализацией - проблема? Допущения не достаточно хороши, чтобы публиковать ответы! – SudoRahul

2

Super класс Demo не Serializable. Таким образом, невозможно сохранить общедоступные, защищенные и (если доступны) поля супертипа, сохраняя объект Demo1.

Чтобы подтипы несериализуемых классов для сериализации, то подтипа может взять на себя ответственность за сохранение и восстановления состояния публики супертипа, в защите, и (если доступно) пакет поля. Подтип может взять на себя эту ответственность, только если класс , который он расширяет, имеет доступный конструктор no-arg для инициализации состояния класса .

Код обновлен -

class Demo implements Serializable { 
    protected String name; 
    protected String address; 
} 

В этом случае вы получите из положить -

Rose - Rohini - 0 

В возрасте transient поэтому он не будет сохранен.

1

После выполнения следующих трех изменений в вашем коде это сработало.

Первый

class Demo { 

изменяется на

class Demo implements Serializable { 

Сделать свой класс Demo сериализации, так как вам нужно сериализовать.

Следующая

class Demo1 extends Demo implements Serializable { 

не будет изменен на

class Demo1 extends Demo { 

Нет необходимости осуществления Сериализуемый для Demo1, поскольку это расширяет Demo которое Сериализуемый.

И, наконец,

transient int age; 

изменяется на

int age; 

Удалите transient от возраста, так как transient поля не будут упорядочены.

P.S: Если не не намерены сериализации age, пусть это будет transient. Я дал это изменение, потому что у вас это было в вашем sysout.

0

Сделать суперкласс «Демо» в этом случае реализует Serializable. Итак, ваш код работает нормально.

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