2015-09-10 4 views
0

Недавно я изучаю язык Java-программы. Мне любопытно узнать о java serializable и немного сомневаюсь в этом.Могут ли java сериализуемые объекты проходить между разными загрузчиками классов?

Может ли сериализуемые объекты java проходить между разными загрузчиками классов? Что такое теория?

+0

Не могли бы вы перефразировать свой вопрос. Передача объектов между загрузчиками классов возможна со всеми объектами, вы получаете только Исключения при доступе к неизвестным классам. Если речь идет о том, как кодировать связь между классами в разных классах загрузчиков, сериализация не является ответом. –

ответ

1

Просто реализуя интерфейс Serializable, вы не сможете «переходить между разными загрузчиками классов». Вам нужно написать код, чтобы перенести сериализованный объект на диск, а затем на другой загрузчик классов (процесс) десериализовать его. вот пример, взятый из http://www.javapractices.com/topic/TopicAction.do?Id=57:

Car car = new Car(); 
    .... 

    //serialize an object called it car to a file called car.ser. 
    try (
     OutputStream file = new FileOutputStream("car.ser"); 
     OutputStream buffer = new BufferedOutputStream(file); 
     ObjectOutput output = new ObjectOutputStream(buffer); 
    ){ 
     output.writeObject(car); // this call writes file to disk 
    } 
    catch(IOException ex){ 
     logger.log(Level.SEVERE, "Cannot perform output.", ex); 
    } 

Для десериализации объекта на другом загрузчик классов процесса конца// Jvm вы можете сделать это:

try(
     InputStream file = new FileInputStream("car.ser"); 
     InputStream buffer = new BufferedInputStream(file); 
     ObjectInput input = new ObjectInputStream (buffer); 
    ){ 
     //deserialize the List 
     Car car = (Car)input.readObject(); 
     //display its data 
     System.out.println("Recovered Car: " + car); 

    } 
    catch(ClassNotFoundException ex){ 
     logger.log(Level.SEVERE, "Cannot perform input. Class not found.", ex); 
    } 
    catch(IOException ex){ 
     logger.log(Level.SEVERE, "Cannot perform input.", ex); 
    } 

EDIT: Для того, чтобы пикап сериализовать файлы и десериализуйте их, вы можете использовать WatchService

+0

Это то же самое, что ObjectOutputStream и ObjectInputStream записывают/читают объекты как сериализуемый объект? –

+0

Если вы спрашиваете, являются ли они одним и тем же объектом/классом, да, конечно, они должны быть одного класса. Поэтому вам нужно поместить объект «Car» в примере выше в файле jar и иметь этот файл jar в пути к классам обоих java-процессов. Вам также нужны объекты с одинаковым идентификатором версии сериализации: http://stackoverflow.com/questions/2258676/what-is-serial-version-id-in-java – chrisl08

+0

Я хочу спросить, является ли сериализуемый способ одинаковым с объектами чтения/записи ObjectInputStream/ObjectOutputStream –

1

«Сериализуемый объект» не может, но вы можете сериализовать объект и сохранять данные в любом месте. В какой-то момент, на той же машине или другой, в той же самой VM или другой, в том же загрузчике классов или другом, вы можете десериализовать сохраненные данные обратно в объект.

+0

Я просто создаю объект, реализующий интерфейс Serializable. Вы имеете в виду, что этот способ не может закончить цель, передающую объект между разными загрузчиками классов? –

+0

Вы можете показать несколько примеров? Спасибо –

+0

Здесь вы можете прочитать все о сериализации: https://docs.oracle.com/javase/8/docs/platform/serialization/spec/serialTOC.html – Andreas

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