2011-09-13 4 views
3

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

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

Примечание: только класс Foo имеет атрибут a и делает не реализовать Сериализуемый

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

ответ

4

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

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

Update: Для того, чтобы иметь возможность сериализации экземплярам Example, когда вы не можете изменить Foo, но необходимо сохранить его содержимое, вы можете реализовать методы readObject() и writeObject(), как описано в API doc of Serializable

2

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

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

+0

спасибо. В любом случае ... теперь у меня есть другая проблема - 'Foo' не может реализовать Serializable, потому что этот класс предоставляется вызовом Api из внешнего' .jar'. Что-то вроде подкласса 'Foo' в нечто вроде' SerializableFoo' (которое реализует 'Selializable') не будет работать, потому что я не могу отбрасывать из супер в подкласс (относительно http://stackoverflow.com/questions/4862960/explicit-casting- from-super-class-to-subclass) – Sonnenhut

+0

@gluca Вам нужно решить, как вы преобразуете 'Foo' в последовательность байтов (или сериализуемых объектов) и обратно, а затем поместите их в (или вызовите) из 'Example'' readObject' и 'writeObject'. –

1

См. NotSerializableException.

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

+0

volatile не имеет ничего общего с сериализацией ... –

+0

@Michael Typo :) Позаботился об этом в Ninja Edit :) –

2

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

1

Тогда нет.

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

java.io.NotSerializableException: Foo 
0

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

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

Например Serialization Example

Надеется, что это помогает

Марке