首页 > 解决方案 > 如何将 JVM 对象序列化和反序列化为字符串?

问题描述

我正在尝试将对象序列化/反序列化为字符串。(字节数组不能满足我的需要。)

我有这个代码:

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

这似乎应该可以工作,但是运行时出现此错误(反序列化):

[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)

我错过了什么?

标签: javascalaserialization

解决方案


你的问题在这里:

val bytes = baos.toString(java.nio.charset.StandardCharsets.UTF_8)

这不会像你想要的那样工作。相反,请尝试使用 Base64 编码器/解码器。那应该工作


推荐阅读