Given this dummy code:
1 case class MyObject(values:mutable.LinkedHashMap[String, String])
...
2 implicit val typeInfoString:TypeInformation[String] = TypeInformation.of(classOf[String])
3 implicit val typeInfoMyObject:TypeInformation[MyObject] = TypeInformation.of(classOf[MyObject])
4
5 val env = StreamExecutionEnvironment.getExecutionEnvironment
6
7 env
8 .fromElements("one")
9 .map(str =>
10 {
11 val obj = MyObject(mutable.LinkedHashMap("key" -> str))
12 val filteredMap1:mutable.LinkedHashMap[String, String] = obj.values.filter(!_._2.contains("bla"))
13
14 obj
15 })
16 .map(obj =>
17 {
18 val filteredMap2:mutable.LinkedHashMap[String, String] = obj.values.filter(!_._2.contains("bla"))
19
20 obj
21 })
The application will crashin line 18 with the exception:
Caused by: java.lang.ClassCastException: scala.collection.mutable.HashMap cannot be cast to scala.collection.mutable.LinkedHashMap
The issues seems to be that through serialization/deserialization the values
member changes its object type, or in other words, LinkedHashMap
turns into HashMap
.
Note that the same code as in line 18 works perfectly in line 12.
When setting a breakpoint to line 12, obj.values
will be shown as LinkedHashMap
by the debugger/IntelliJ, however a breakpoint in line 18 will show obj.values
as HashMap
in the debugger.
What is going on here? How can I fix this? After all, LinkedHashMap
implements Serializable
?!