java - 如何将 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)
我错过了什么?
解决方案
你的问题在这里:
val bytes = baos.toString(java.nio.charset.StandardCharsets.UTF_8)
这不会像你想要的那样工作。相反,请尝试使用 Base64 编码器/解码器。那应该工作
推荐阅读
- apache - 提取 Apache 环境变量“REMOTE_USER”仅适用于 SSL
- angular - 样式化角度 2 工具提示
- highcharts - Chrome 不会在 Highcharts 中显示 x 轴标签,Safari 和 Firefox 会这样做
- testing - UFT/QTP System.InvalidCastException 错误
- c - 如何在C中找到缓冲区的大小
- java - Java Multimap 自然排序的键,但集合按元素添加的顺序排序
- ios - 使用 CorePlot CPTAxisLabelingPolicyAutomatic 设置显示最大 y 轴
- amazon-dynamodb - 我可以测量将项目放入 DynamoDB 所需的总时间吗(网络 + DynamoDB)
- html - 将字符限制在输入文本框的末尾
- sql - 每个客户 ID 的 SQL SERVER 最小和最大日期