2012-04-29 1 views
3

Мои code-Получение OptionalDataException из примитивного значения INT, но как избежать этого в JAVA

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 

public class ObjectStreamExample { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     Person person = new Person(); 
     person.setFirstName("Abhishek"); 
     person.setLastName("Choudhary"); 
     person.setAge(25); 
     person.setHouseNum(256); 
     ObjectOutputStream stream = null; 
     try { 
      stream = new ObjectOutputStream(new FileOutputStream(new File("Serialize.txt"))); 
      stream.writeUTF(person.toString()); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 

      e.printStackTrace(); 
     }finally{ 
      if(stream != null) 
       try { 
        stream.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
     } 

     ObjectInputStream input = null; 

     try { 
      input = new ObjectInputStream(new FileInputStream(new File("Serialize.txt"))); 

      Person person2 = (Person) input.readObject(); 
      System.out.println(person2.getFirstName()); 
      System.out.println(person2.getLastName()); 
      System.out.println(person2.getAge()); 
      System.out.println(person2.getHouseNum()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     }finally{ 
      if(input != null) 
       try { 
        input.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
     } 


    } 

} 

и один Person файл компонента.

Я получаю исключение

java.io.OptionalDataException на java.io.ObjectInputStream.readObject0 (Unknown Source) в java.io.ObjectInputStream.readObject (Unknown Source) в com.practise .interview.nio.ObjectStreamExample.main (ObjectStreamExample.java:62)

Это становится поднят, потому что я думаю, -

Была предпринята попытка прочитать объект, когда следующий элемент в потоке является примитивным. В этом случае поле длины OptionalDataException устанавливается на количество байтов примитивных данных , которые можно легко прочитать из потока, а поле eof установлено равным .

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

ответ

6

Вы пишите String и пробуйте прочитать Person. Это не так, как работает сериализация. В контексте сериализации строка UTF считается примитивными данными, поскольку она не содержит информацию об объекте (имя класса, атрибуты и т. Д.), А только строковые данные.

Выпишите сам person объект, если вы хотите прочитать Person потом:

stream.writeObject(person); 

Добавление: Если запись String будет вести себя, как с любой другой Object, вы получите ClassCastException вместо этого, потому что String не может быть отнесен к Person. В любом случае несоответствие между тем, что вы пишете, и тем, что вы читаете, вызывает ошибку.

+0

«* В контексте сериализации, символьная строка UTF считаются примитивными данными *» - Источник? –

+0

«Строка» не сериализуется как любой другой объект, содержащий символ «char []», но обрабатывается специально каркасом. - https://docs.oracle.com/javase/8/docs/platform/serialization/spec/output.html#a933 - "9. Если объектом является java.lang.String, строка записывается как длина информацию, за которой следует содержимое строки, закодированной в модифицированном UTF-8 ». - https://docs.oracle.com/javase/8/docs/platform/serialization/spec/serial-arch.html#a4176 - «Примитивные типы данных записываются в поток с помощью методов в интерфейсе DataOutput, таких как как writeInt, writeFloat или writeUTF. " –

1

accroding спецификация

Исключения, указывающее на отказ объекта операции чтения из-за непрочитанные примитивные данные, или конца данных, относящихся к сериализованному объекту в потоке. Это исключение может быть брошено в двух случаях:

  • Была сделана попытка прочитать объект, когда следующий элемент в потоке примитивные данные. В этом случае поле длины OptionalDataException устанавливается на количество байтов примитивных данных , которые можно легко прочитать из потока, а поле eof установлено равным .
  • Была сделана попытка прочесть за конец данных, потребляемых классом класса readObject или readExternal. В этом случае поле eof OptionalDataException равно true, а поле длины установлено в 0.

    stream.writeUTF (person.toString()); // Проблема здесь

Здесь вы пишете как UTF, и на другом конце вы читаете объект Person. Вы должны изменить его -

stream.writeObject(person);