Herança com objetos serializados

0 respostas
L

Ola pessoal, tem uma coisa que me deixou com duvida aqui, imagina que eu tenho um EJB com um método que recebe como parâmetro um objeto Foo:

public class Foo implements Serializable {
		private static final long serialVersionUID = 6250275667653681615L;

		private int atributo;

		public int getAtributo() {
			return atributo;
		}

		public void setAtributo(int atributo) {
			this.atributo = atributo;
		}
	}

Ai alguem que vai usar meu EJB, criou uma classe que extende Foo e sobrescreve getAtributo:

public class Foo2 extends Foo {

		private static final long serialVersionUID = -2724238215363246468L;

		@Override
		public int getAtributo() {
			System.out.println("teste");
			return 1;
		}

	}

ai vamos supor que o método do meu EJB execute o getAtributo do objeto foo que vem, como foi um Foo2 ele vai executar o getAtributo imprimindo ‘teste’ e retornando 1… então, só que agora vamos supor que meu servidor de aplicação tá rodando na minha maquina, como um serviço, e o cara que criou Foo2 e eu se quer conheço sabe acessar meu EJB. Sabendo que vai ser executado getAtributo, o que impede o cara de sobrescrever getAtributo fazendo coisas que não devem e isso ser executado no meu servidor?!

Da mesma forma, meu sistema le um arquivo com objetos Foo, e o cara de sacanagem grava um monte de Foo2 sobrescrevendo readObject (com um código que faz cagada) e meu sistema le…

public class Teste {

	static class Foo implements Serializable {
		private static final long serialVersionUID = 6250275667653681615L;

		private int atributo;

		public int getAtributo() {
			return atributo;
		}

		public void setAtributo(int atributo) {
			this.atributo = atributo;
		}
	}

	static class Foo2 extends Foo {

		private static final long serialVersionUID = -2724238215363246468L;

		private void readObject(java.io.ObjectInputStream in)
				throws IOException, ClassNotFoundException {
			System.out.println("estou fazendo cagada");
		}
	}

	static String FILENAME = "/home/lroos/teste1.x";

	static void ler() throws IOException, ClassNotFoundException {
		InputStream is = new FileInputStream(new File(FILENAME));
		ObjectInputStream ois = new ObjectInputStream(is);
		Foo foo = (Foo) ois.readObject();
		System.out.println(foo.getAtributo());
		ois.close();
		is.close();
	}

	static void gravar() throws IOException {
		Foo foo = new Foo2();
		foo.setAtributo(9);
		OutputStream os = new FileOutputStream(new File(FILENAME));
		ObjectOutputStream oos = new ObjectOutputStream(os);
		oos.writeObject(foo);
		oos.close();
		os.close();
	}

	public static void main(String[] args) throws IOException,
			ClassNotFoundException {
		gravar();
		ler();
	}
}

Qual é a solução para isso?! declarar classes de objetos que serão serializados (Foo) como final?! ou existe outra?!

valeu!

Criado 31 de maio de 2007
Respostas 0
Participantes 1