Сериализуемый Java (все переменные затронуты?) - PullRequest
3 голосов
/ 13 сентября 2011

Я хочу узнать, будет ли атрибут foo также сериализован в следующем примере или нет (записано у меня в голове):

public class Example implements Serializable {
     private String a = "a";
     private Foo foo = new Foo("a");
}

ПРИМЕЧАНИЕ. Класс Foo содержит только атрибут a и не не реализует Serializable

Если Foo не Serializable, у меня есть другая проблема, что Foo не может реализовать Serializable, потому что это обеспечивается вызовом API от внешнего .jar -файла. Также в моем конкретном случае Foo также содержит класс Bar, который также не является Serializable.

Ответы [ 6 ]

4 голосов
/ 13 сентября 2011

Если Foo не является сериализуемым, попытка сериализации экземпляра примера с ненулевым foo приведет к NotSerializableException, если foo не объявлено transient.

Вы могли бы легко узнать это, просто попробовав это.

Обновление: Чтобы иметь возможность сериализовать экземпляры Example, когда вы не можете изменить Foo, но необходимо сохранить его содержимое, вы можете реализовать методы readObject() и writeObject(), как описано в документе API в Serializable

2 голосов
/ 13 сентября 2011

Если Foo не сериализуемо, попытка сериализации экземпляра Example вызовет исключение времени выполнения.Вам нужно сделать его сериализуемым или пометить поле foo как transient.Но в последнем случае при десериализации примера foo будет нулевым.

2 голосов
/ 13 сентября 2011

Если экземпляр foo не равен Serializable, сериализация Example завершится неудачно - попробуйте!

Можно предоставить настраиваемую сериализованную форму Example, указав методы readObject и writeObject.

1 голос
/ 13 сентября 2011

Тогда нет .

Вы получите это:

   java.io.NotSerializableException: Foo
1 голос
/ 13 сентября 2011

См. NotSerializableException .

Только поля transient не пропускаются при сериализации.

0 голосов
/ 13 сентября 2011

Я думаю, вам нужно будет заняться пользовательской сериализацией, если вы хотите получить сериализованный объект Example.здесь вы идете: 1. Поскольку Foo исходит от jar, который вы не можете изменить, сделайте его временным (иначе вы получите исключение во время выполнения, как было указано ранее).2. Определите «readObject» / «writeObject» и оттуда управляйте процессом сериализации.- Вызовите defaultWriteObject, чтобы сделать сериализацию Java тем, что он может сериализовать.извлечь состояние класса foo (в вашем примере внутреннее состояние Foo - «a») - явно сериализовать «a». То же самое следует сделать во время десериализации: - вызвать механизм десериализации по умолчанию - десериализовать «a» (вы знаете, что сразу после данных по умолчанию в потоке есть ваша пользовательская строка - создайте экземпляр Foo из A из readObject.

В общем, я бы порекомендовал прочитать об этом в книге Джошуа Блоха «Эффективная Java» - он хорошо освещает эту тему.Кроме того, в интернете много примеров

Например Пример сериализации

Надеюсь, это поможет

Mark

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...