Отправка того же, но modifed возражает по ObjectOutputStream

Java всегда будет пытаться использовать наиболее подходящую версию доступного метода (см. JLS §15.12.2 ).

Object, char[] и Integer могут принимать null в качестве действительного значения. Поэтому все 3 версии применимы, поэтому Java придется найти наиболее конкретный.

Поскольку Object является супертипом char[], версия массива более специфична, чем Object -версия. Поэтому, если существуют только эти два метода, будет выбрана версия char[].

Если доступны версии char[] и Integer, то оба они более специфичны, чем Object, но ни один более конкретный, чем другой, поэтому Java не может решить, какой из них вызывать. В этом случае вам придется явно указать, какой из них вы хотите вызвать, отвечая аргумент соответствующему типу.

Обратите внимание, что на практике эта проблема встречается гораздо реже, чем можно было бы подумать. Причиной этого является то, что это происходит только тогда, когда вы явно вызываете метод с null или с переменной довольно неспецифического типа (например, Object).

Напротив , следующий вызов будет совершенно однозначным:

char[] x = null;
doSomething(x);

Хотя вы все еще передаете значение null, Java точно знает, какой метод вызывать, поскольку он учитывает тип переменной .

20
задан Eddie 28 February 2009 в 17:41
поделиться

3 ответа

Поток имеет ссылочный график, таким образом, объект, который отправляется дважды, не даст два объекта на другом конце, Вы только получите тот. И отправка того же объекта дважды отдельно приведет Вам тот же пример дважды (каждый с теми же данными - который является тем, что Вы видите).

Видят сброс () метод, если Вы хотите сбросить график.

27
ответ дан 30 November 2019 в 00:40
поделиться

Max корректен, но можно также использовать:

public void writeUnshared(Object obj);

См. комментарий ниже для протеста

6
ответ дан 30 November 2019 в 00:40
поделиться

То, что Вы, вероятно, хотите:

ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
List same = new ArrayList();
same.add(0);
oos.writeObject(same);
oos.flush();  // flush the stream here
same.clear();
same.add(1);
oos.writeObject(same);

Иначе тот же объект будет сброшен дважды, когда поток будет закрыт, или его буфер заканчивается.

Просто к вашему сведению, когда Вы десериализовываете объекты в, скажем, o1 и o2, o1 != o2.

-4
ответ дан 30 November 2019 в 00:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: