2011-02-07 19 views
28

¿Por qué java.util.List no implementa Serializable mientras que las subclases como LinkedList, Arraylist do? ¿No parece estar en contra de los principios de herencia? Por ejemplo, si queremos enviar un LinkedList través de una red, tenemos que escribir:¿Por qué java.util.List no implementa Serializable?

new ObjectOutputStream(some inputStream).writeObject(some LinkedList); 

Hasta aquí todo bien, pero al leer el objeto en el otro lado, tenemos que decir explícitamente LinkedList l = (LinkedList)objectInputStream.readObject(); en lugar de List l = (List)objectInputStream.readObject();. Si alguna vez cambiamos la funcionalidad de escritura de LinkedList para decir ArrayList, también tendremos que cambiar la parte de lectura. Tener List implementar Serializable habría resuelto el problema.

+2

no creo que la segunda parte de su declaración es exacta, no es que yo he tenido la oportunidad de probarlo. ¿Qué tipo de errores estás recibiendo? –

Respuesta

35

List no implementa Serializable porque no es un requisito clave para una lista. No hay garantía (o necesidad) de que todas las implementaciones posibles de un List puedan ser serializadas.

LinkedList y ArrayList optan por hacerlo, pero eso es específico para su implementación. Otras implementaciones List pueden no ser Serializable.

+2

En ese caso, el mismo argumento se puede aplicar a LinkedList, ya que al ser una lista muy básica, no se puede serializar, ya que no es un requisito de una lista. –

+10

Hay una diferencia al forzar que todas las implementaciones de una lista sean serializables, y la elección de una implementación en particular es serializable. –

+1

LinkedList es una implementación a la que los desarrolladores eligen otorgar la propiedad serializable. Si seguimos su razonamiento, ninguna clase debería implementar dos interfaces a la vez ... – Dunaril

3

Porque List está abierto para ser implementado también por subclases específicas del usuario, y los implementadores pueden no desear implementar el Serializable. La serializabilidad tampoco pertenece a las responsabilidades clave de List, por lo que no hay ninguna razón para vincular ambas.

7

La lista es una interfaz y hacer que se extienda Serializable significa que cualquier implementación de List debe ser serializable.

La propiedad serializable no es parte de la abstracción de la lista y, por lo tanto, no debería ser necesaria para una implementación.

1

Considere la hipotética ThreadList implements List<Thread>, que contiene la lista de hilos activos en cualquier punto dado en el tiempo. La implementación explora de manera transparente los hilos activos y permite un fácil acceso a ellos, para su comodidad. ¿Debería dicha implementación ser serializable (olvidando que Thread no es serializable)?

Corresponde a la persona que implementa la interfaz para decidir, si su implementación es segura para ser serializada. List es demasiado genérico, ya que básicamente indica * colección ordenada de elementos de tipo T`.

3

No. A LinkedList es siempre una lista. Al deserializar la lista enlazada, ya que una LinkedList es una lista, puede escribir

List l = (List) objectInputStream.readObject(); 

El hecho de que l es de hecho una LinkedList no es importante. Querías una Lista, y obtuviste una Lista.

+0

¿Está seguro? ¿Cómo entendería el tiempo de ejecución cómo deserializar el objeto si lo transfiere a una interfaz no serializable? – Dunaril

+1

El yeso ocurre después de la deserialización y por lo tanto no es importante aquí -> cast to List is fine – Puce

+3

El tiempo de ejecución sabe cómo seserializar el objeto porque su secuencia de bytes serializada contiene el nombre de la clase del objeto que se ha serializado. ObjectInputStream crea así una instancia de esta clase y la rellena con los datos encontrados en el objeto serializado, y luego la devuelve a la persona que llama. La persona que llama sabe que se trata de una lista que se serializó y, por lo tanto, convierte el objeto devuelto en una Lista. –

-2

Lista extiende colección, y no se puede poner en práctica nada porque es una interfaz ...

+3

presumiblemente el OP significaba que 'List' debería extender' Serializable' * además * a 'Collection', el hecho de que usara la palabra implementar debería entenderse en contexto ... – davin

0

Si implementa Lista/extiende Serializable entonces usted ha implicado el contrato que todas las clases de implementación/subclases de la lista también están los que Serializable no siempre es verdad Por ejemplo, mire la implementación de colecciones de guayaba de ForwardingListMultimap. No necesita ser Serializable funcionalmente y esto fue posible solo porque List no es Serializable.

0

Por qué es que java.util.List no implementa Serializable ...

Debido a que no todos los List aplicación en el mundo debe ser Serializable.

mientras lee el objeto en el otro lado, tenemos que decir explícitamente ... en lugar de

List l = (List) objectInputStream.readObject(); 

¿Lo has probado? Si lo haces, creo que encontrarás que funciona.

1

Su pregunta parece estar basado en un malentendido. Para serializar un objeto, el objeto (o su clase) tiene que implementar Serializable, pero no es necesario utilizar una expresión de tipo Serializable (o algún subtipo) para hacer esto. Es bastante intencional que el método writeObject tiene un tipo de parámetro de Object y no Serializable, así como el tipo de retorno de readObject().

Pero incluso si estos parámetros y devuelven tipos fueron Serializable, usted no necesita saber los tipos específicos de implementación:

ObjectOutputStream stream = ...; 
List myList = ...; 
stream.writeObject((Serializable)myList); 

y

ObjectInputStream stream = ...; 
List myList = (List) stream.readObject(); 

funcionaría así como funciona ahora (sin el elenco de Serializable).

ObjectInputStream y ObjectOutputStream no se preocupan en absoluto por sus tipos al invocar, simplemente miran el objeto en cuestión y su clase.

Cuestiones relacionadas