Reputation: 11542
I'm trying to serialize/deserialize an object to a String. (A byte array doesn't work for my needs.)
I have this code:
inline def serialize(o: Object): String =
val baos = new ByteArrayOutputStream()
val oos = new ObjectOutputStream(baos)
oos.writeObject(o)
val bytes = baos.toString(java.nio.charset.StandardCharsets.UTF_8)
baos.close
oos.close
bytes
inline def deserialize(b: String): Object =
val bytes = b.getBytes(java.nio.charset.StandardCharsets.UTF_8)
val bais = new ByteArrayInputStream(bytes)
val ois = new ObjectInputStream(bais)
val ret = ois.readObject()
bais.close
ois.close
ret
This seems like it should work but I get this error when run (deserialization):
[info] running co.blocke.dotty_reflection.RunMe
[error] (run-main-3) java.lang.ExceptionInInitializerError
[error] java.lang.ExceptionInInitializerError
[error] at co.blocke.dotty_reflection.RunMe.main(RunMe.scala)
[error] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error] at java.base/java.lang.reflect.Method.invoke(Method.java:566)
[error] Caused by: java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
[error] at java.base/java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:877)
[error] at java.base/java.io.ObjectInputStream.<init>(ObjectInputStream.java:350)
[error] at co.blocke.dotty_reflection.RunMe$.<init>(RunMe.scala:11)
[error] at co.blocke.dotty_reflection.RunMe$.<clinit>(RunMe.scala)
[error] at co.blocke.dotty_reflection.RunMe.main(RunMe.scala)
[error] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error] at java.base/java.lang.reflect.Method.invoke(Method.java:566)
What am I missing?
Upvotes: 0
Views: 142
Reputation: 35096
Your problem is here:
val bytes = baos.toString(java.nio.charset.StandardCharsets.UTF_8)
This won't work like you'd like it to. Instead, try using Base64 Encoder/Decoder. That should work
Upvotes: 1