У меня есть другая перспектива ответить на это.
При работе на разных уровнях, например, в приложении MVC, контроллеру нужны службы для вызова бизнес-операций. В таких сценариях контейнер инжекции зависимостей может использоваться для инициализации служб, чтобы исключить исключение NullReferenceException. Это означает, что вам не нужно беспокоиться о проверке нулевого значения и просто вызвать службы с контроллера, как будто они всегда будут доступны (и инициализированы) как одиночный или прототип.
public class MyController
{
private ServiceA serviceA;
private ServiceB serviceB;
public MyController(ServiceA serviceA, ServiceB serviceB)
{
this.serviceA = serviceA;
this.serviceB = serviceB;
}
public void MyMethod()
{
// We don't need to check null because the dependency injection container
// injects it, provided you took care of bootstrapping it.
var someObject = serviceA.DoThis();
}
}
Поток имеет ссылочный граф, поэтому объект, который отправляется дважды, не даст двух объектов на другом конце, вы получите только один. И отправка одного и того же объекта дважды по отдельности даст вам один и тот же экземпляр дважды (каждый с теми же данными - это то, что вы видите).
См. Метод reset (), если вы хотите сбросить график .
То, что вы, вероятно, хотите, это:
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);
В противном случае один и тот же объект будет дважды сброшен, когда поток будет закрыт или его буфер закончится.
Просто FYI, когда вы десериализуйте объекты, скажем, o1
и o2
, o1 != o2
.
Макс правильный, но вы также можете использовать:
public void writeUnshared(Object obj);
См. комментарий ниже для caveat