Будет ли Java-сериализация создавать дубликаты?Как насчет ссылок в сериализованных экземплярах? - PullRequest
0 голосов
/ 27 сентября 2018

Сериализация Java создает дубликаты?Если это так, то это мелкий дубликат или глубокий дубликат?

У меня есть несколько классов со следующей настройкой:

public class A{
    public C c;
}

public class B {
    public C c;
}

public class C implements Serializable {
    ...
}

public class Wrapper implements Serializable {
    public C c;
}

У меня есть компонент, который передает объекты байтовыми массивами, и как толькопроцесс сериализации завершен, ObjectOutputStream / ObjectInputStream будет закрыт.

Сначала я сериализовал Ac и передал его в Bc Является ли Bc дублированием Ac?Затем я создал класс-обертку в B и обернул Bc.Теперь, если я сериализую экземпляр оболочки, передам его в A и десериализую в A, что будет с оболочкой?Ссылка на Bc?Или совершенно новый экземпляр C?

Pesudo code:

{
    ...
    A a = new A();
    B b = new B();
    C c = new C();
    a.c = c;
}

{
    //Somewhere in A
    byte[] cData = SomethingThatSerializesObjects.Serialize(c);
    b.c = SomethingThatSerializesObjects.Deserialize(cData);

    //Is b.c a duplication of a.c?
}

{
    //Somewhere in B
    Wrapper wrapper = new Wrapper();
    wrapper.c = c;
    byte[] wrapperData = SomethingThatSerializesObjects.Serialize(wrapper);
    //Give the wrapperData to a
}

{
    //And somewhere in A
    //Receives wrapperData
    Wrapper wrapper = SomethingThatSerializesObjects.Deserialize(wrapperData);
    C tmp = wrapper.c;

    //Is tmp a reference to b.c? Or a new C instance?
}

1 Ответ

0 голосов
/ 27 сентября 2018

Десериализация создает новые экземпляры: каждый раз, когда вы десериализуете, вы получаете новую копию объектов, которые были первоначально сериализованы

C c1 = SomethingThatSerializesObjects.Deserialize(cData);
C c2 = SomethingThatSerializesObjects.Deserialize(cData);
// c1 != c2

Метод readResolve() - способ обойти это, есть пример здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...