Tengo una pregunta serialización de Java que no se informó ni negada como problemática en Java Docs (para JDK8 ).
Así, supongamos que tengo una clase que implementa Serializable
private static final long serialVersionUID = 1L;
private List<CharSequence> values;
Si cambio values
de
private List<String> values;
debería cambiar el serialVersionUID
?
Otra forma de pensar de esta operación de serialización / deserialización es que es un poco como la fundición.
Se puede emitir una List<CharSequence>
a una List<String>
? No directamente: el compilador se detendrá, porque los genéricos son invariantes. Puede forzar a que, sin embargo:
List<String> list = (List<String>) (List<?>) listOfCharSequences;
String entry = list.get(0);
y esto podría trabajar una gran parte del tiempo, ya que, String
es el más común CharSequence
.
Pero es posible que haya algo más ahí, que es una CharSequence
, pero no String
, por ejemplo, una StringBuilder
. El código anterior se estrellaría con una ClassCastException
.
Por lo tanto, si usted puede estar seguro de que todos sus CharSequence
s son realmente String
es, es seguro para hacer este cambio. De lo contrario, debe protegerse, ya sea en contra de ella, cambiando la versión de serie de identificación; o, en el caso de String
, simplemente podría invocar toString()
en todos los elementos:
List<String> listOfStrings = listOfCharSequences.stream()
.map(cs -> Objects.toString(cs, null))
.collect(toList())
( String.toString()
Mismo vuelve, por lo que este no volverían nueva instancia de elementos que ya están String
s)