Какие классы должны реализовывать интерфейс Serializable? - PullRequest
1 голос
/ 13 августа 2011

Я хочу отправить объект через сокет, поэтому я должен реализовать Serializable. Но мой класс является составным классом, как этот простой код:

class B{
    private int a;
    public B(int aa){a=aa;}
}

class A {
    private B b;
    public A(B b1){ b=b1;}
}

Я хочу отправить объект класса A со всем его содержимым, например, объект B внутри. Какие классы должны реализовывать Serializable? только A или оба A и B?


Дополнение: как насчет векторов? Подумайте, что у меня есть вектор B в A, например:

class A {
    private Vector bvector;
}

Ответы [ 5 ]

3 голосов
/ 13 августа 2011

Оба.A не может быть сериализуемым, если он имеет нестатический член типа B и 1) переменная b не помечена transient или 2) класс B не реализует Serializable.

2 голосов
/ 13 августа 2011

Если ни один из классов не является внутренним, вы можете сделать это любым способом. Проще во многих случаях сериализовать оба независимо. Но обычно сериализация A быстрее и более независима от версии и вместо B включает информацию, необходимую для воссоздания B в сериализации A.

Если один или оба являются внутренними классами, то их сериализация становится более запутанной / медленной, и лучше включить информацию об их воссоздании во внешний класс.

Конечно, когда на объекты класса ссылаются из нескольких других объектов, у вас обычно нет другого выбора, кроме как сериализовать их отдельно.

1 голос
/ 13 августа 2011

Вы можете сериализовать экземпляры A, даже если B не объявлено как Serializable. Требования к этому таковы:

  1. Класс B должен сделать доступным конструктор по умолчанию (и)
  2. Класс A должен обеспечивать реализации следующих методов:

    private void readObject(ObjectInputStream ois)

    private void writeObject(ObjectOutputStream oos)

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

Наличие Vector в B не имеет значения в описанной выше ситуации (оно просто добавляет еще один слой структуры).

1 голос
/ 13 августа 2011

Если вы не сделаете сериализуемую версию B, вы получите исключение сериализации.

0 голосов
/ 13 августа 2011

Вы можете иметь сериализованный вектор оберточного класса при условии, что это поле другого сериализуемого класса или подкласса Vector, чтобы изменить его сериализацию.Этот класс может заблокировать вектор для сериализации и сериализации классов A и B.Если вы используете этот подход, вам не нужно добавлять интерфейс Serializable marker.

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