1

привет Я Learing сериализацию объектов и попытался этоСериализация объектов Java, Не удалось закрыть ObjectOutputStream?

import java.io.*; 
class Employee implements Serializable{ 
     Employee(int temp_id,String temp_name) 
     { 
     id=temp_id; 
     name=temp_name; 
     } 
int id; 
String name; 
} 

public class SerialTest{ 

public static void main(String[] args) 
{ 
     Employee e1=new Employee(14,"John"); 

     try{ 
     FileOutputStream fileStream=new FileOutputStream("myserial.ser"); 
     ObjectOutputStream os=new ObjectOutputStream(fileStream); 

     os.writeObject(e1); 
     } 
     catch(IOException ioex) 
     { 
     ioex.printStackTrace(); 
     } 
     finally{ 
     os.close(); 
     } 
}//main ends 
}//class ends 

Программа работала, прежде чем я положил в вызове

os.close(); 

Теперь я не компилирует, я получаю ошибку говоря

SerialTest.java:29: cannot find symbol 
symbol : variable os 
location: class SerialTest 
    os.close(); 
    ^

Работало до того, как я попытался закрыть ObjectOutPutStream, содержание сериализованного файла приведено ниже,

¬í^@^Esr^@^HEmployee^S < 89> S§ ± < 9b> éØ^B^@^BI^@^BidL^@^Dnamet^@^RLjava/lang/String; xp^@^@^@^Nt^@^GSainath ~
Я не могу понять, где я иду не так, пожалуйста, помогите!

+4

Вы должны прочитать о том, что * переменная сфера * есть. Также проверьте try-with-resources. – Pshemo

+1

ой! , являются ли объекты в try {// объявлении объекта} ограниченным в блоке try? –

+1

Вы на 99% правильны, потому что это не объекты, которые ограничены областью, но переменными (ссылками). Из-за этого вам нужно создать ссылку перед блоками 'try', если вы хотите использовать ее вне' try' (например, в 'catch' или' finally'). Вы можете установить эту ссылку на «null» и изменить ее значение в 'try'. Вы можете позволить компилятору обрабатывать его автоматически, используя [try-with-resources] (http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) – Pshemo

ответ

3

Вы хотите использовать purpose-built try-with-resources:

try (ObjectOutputStream os = 
      new ObjectOutputStream(new FileOutputStream("myserial.ser"));) { 
     os.writeObject(e1); 
    } catch(IOException ioex) { 
     ioex.printStackTrace(); 
    }