2013-08-03 2 views

ответ

1

Поскольку классы, которые не реализуют Serializable, все еще могут быть сериализованы ObjectOutputStream.

Это неверно. Это заставило бы NotSerializableException.


Причина writeObject() принимает Object вместо Serializable является то, что подпись исходит от реализации интерфейса ObjectOutput, который определяется независимо от сериализации. Но затем он запрещает замену своей подписи ObjectOutputStream.

public interface ObjectOutput { 
    // ... 
    void writeObject(Object obj); 
} 
+0

Значит, это не имеет смысла? – MinecraftShamrock

2

Поскольку объект сериализация является более сложной, чем простая реализация сериализуемого (думают о прокси: проксированном объект может реализует Serializable, но не исходный объект и в своем коде вы все еще используете оригинальный класс)
Другим способ реализует сериализацию является Externalizable интерфейса, чтобы иметь полный контроль над сериализацией объекта или (из документации):
Классов, которые требуют специальной обработки во время сериализации и десериализации процесса должен реализовать специальные методы с этими точными подписями:

private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException; 
private void writeObject(java.io.ObjectOutputStream stream) throws IOException 
private void readObjectNoData() throws ObjectStreamException; 

см. На странице ObjectOutputStream javadoc для получения дополнительной информации о процессе/механизме сериализации.

EDIT: ответить на ваш вопрос, переходное это ключевое слово, используемое только в контексте сериализации поэтому не Serializable объекта с транзиторным полем не имеет смысла

1

Обычно если супер класс реализует Serializable это подклассы сериализуемы, как well.Это единственная ситуация, когда вы можете сделать поля переходными, и класс не реализует Serializable напрямую, но помимо этого, если класс не сериализуем, нет смысла делать их переходными.

+1

В этом случае класс также реализует Serializable через наследование. –

2

Возможно, вы захотите пометить его как временный по нескольким причинам. Два, которые сразу приходят на ум, следующие:

  • Это может помочь передать семантическую цель поля. I.e., это помогает любому, кто читает ваш код, понять, что переменная должна быть для

  • Сторонние библиотеки могут использовать ключевое слово. Например, библиотека Gson от Google может сериализовать/десериализовать любой объект в/из JSON, независимо от того, реализует ли он Serializable. В этом случае Gson (по умолчанию) пропускает поля, помеченные как переходные.

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