Отправка хэш-карты через сокет - получена другая переменная относительно того, что отправлено [duplicate]

У меня есть другая перспектива ответить на это.

При работе на разных уровнях, например, в приложении 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();
    }
}
18
задан Eddie 1 March 2009 в 04:41
поделиться

3 ответа

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

См. Метод reset (), если вы хотите сбросить график .

25
ответ дан Max Stewart 31 August 2018 в 12:21
поделиться

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

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.

-4
ответ дан Marcin 31 August 2018 в 12:21
поделиться

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

public void writeUnshared(Object obj);

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

6
ответ дан Pyrolistical 31 August 2018 в 12:21
поделиться
  • 1
    Это будет работать в этом случае, но, как правило, вызывает очень странные ошибки. Любой написанный компонент будет по-прежнему использоваться совместно. Так, например, если список выше был завернут с Collections.synchronizedList, проблема осталась бы. writeUnshared не очень полезен. – Tom Hawtin - tackline 27 September 2008 в 15:15
Другие вопросы по тегам:

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