Десериализация коллекции, содержащей переменные абстрактного класса

0
20 апр 2016 20:20
Собственно, имеется класс, экземпляр которого нужно сериализовать. В этом классе имеется поле, private List<Transform> transforms. Для сериализации я использовал реализацию Externalizable и метод writeExternal.

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
	    out.writeInt(this.transforms.size());
	    for(Externalizable ext : this.transforms) {       
	    	ext.writeExternal(out);
	    }
	}


Для десериализации по идее я должен использовать такой алгоритм:

    @Override
	public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
	    count = in.readInt();
	    for(int i=0; i < count; i++){
	        Transform fc = new Transform();
	        fc.readExternal(in);
	        this.transforms.add(fc);
	    }
	}


Но такой код выдает ошибку, что и логично, т.к. нельзя создавать экземпляры абстрактного класса. Собственно, как можно решить данную проблему?

Ответов: 2

1
21 апр 2016 19:39
Можно перед ext.writeExternal(out); в цикле записывать в out строку с именем конкретного класса (или некий числовой идентификатор) . При чтении, соответственно, в зависимости от идентификатора, создавать экземпляр требуемого конкретного класса (можно реализовать в виде статического фабричного метода).
0
21 апр 2016 03:45
Вы неправильно Externalizable используете. Методы read/writeExternal никогда не надо руками вызывать, также как и объекты инстанциировать.
    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
	    out.writeInt(this.transforms.size());
	    for(Externalizable ext : this.transforms) {       
	    	out.writeObject(ext);
	    }
	}


        @Override
	public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
	    count = in.readInt();
	    for(int i=0; i < count; i++){
                Transform fc = (Transform) in.readObject();
	        this.transforms.add(fc);
	    }
	}

Естественно, во всех реализациях Transform методы сериализации и десериализации должны быть правильно реализованы.
А вообще, главный вопрос тут в другом - действительно ли Вам нужен Externalizable?
Модераторы: Нет
Сейчас эту тему просматривают: Нет