kryo java_使用Kryo序列化任意Java对象(获取IllegalAccessError)
动机:
为了帮助进行远程调试(Java),能够请求远程服务器将任意对象发送到我的本地计算机进行检查是很有用的。但是,这意味着远程服务器必须能够序列化运行时事先未知的任意Java对象。
于是我四处询问,偶然发现了Kryo序列化库。根据Kryo的文档,主要功能是在序列化任意Java对象方面非常强大。对象不必实现Serializable,不需要no-
arg构造函数就可以反序列化,而且我甚至不需要在序列化之前就了解对象的结构。完善!
问题:
因此,为了测试Kryo,我尝试查看是否可以序列化然后反序列化一个PrintWriter对象(即任意对象):
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import java.io.*;
public class SerializationTest {
private static final String ioFileName = "someIO.bin";
public static void main(String[] args) {
// Create a PrintWriter object that I will later attempt to serialize
PrintWriter outObj = null;
try {
outObj = new PrintWriter("textfile.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// Change the PrintWriter's state as a test for later to see if state is restored after serialization and deserialization
outObj.println("Hello"); // "Hello" held in PrintWriter's buffer
Kryo kryo = new Kryo(); // Initialize Kryo serialization
writeObj(kryo, outObj); // Save PrintWriter object to file with "Hello" still in its buffer
// Read the previously saved Printwriter object (still with "Hello" in its buffer)
PrintWriter inObj = (PrintWriter) readObj(kryo);
inObj.close(); // commit "Hello" to disk (using deserialized object)
outObj.close(); // commit "Hello" to disk (using original object)
System.out.println(inObj);
}
public static Object readObj(Kryo kryo) {
Object obj = null;
try {
Input input = new Input(new FileInputStream(ioFileName));
obj = kryo.readClassAndObject(input); // ERROR HERE!!
input.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return obj;
}
public static void writeObj(Kryo kryo, Object obj) {
try {
Output output = new Output(new FileOutputStream(ioFileName));
kryo.writeClassAndObject(output, obj);
output.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
序列化工作正常,但是反序列化后,kryo.readClassAndObject(input)对第39行的调用给出了以下内容IllegalAccessError:
Exception in thread "main" java.lang.IllegalAccessError: tried to access class sun.nio.cs.UTF_8 from class sun.nio.cs.UTF_8ConstructorAccess
at sun.nio.cs.UTF_8ConstructorAccess.newInstance(Unknown Source)
at com.esotericsoftware.kryo.Kryo$DefaultInstantiatorStrategy$1.newInstance(Kryo.java:1234)
at com.esotericsoftware.kryo.Kryo.newInstance(Kryo.java:1086)
at com.esotericsoftware.kryo.serializers.FieldSerializer.create(FieldSerializer.java:547)
at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:523)
at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:704)
at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:106)
at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:528)
at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:704)
at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:106)
at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:528)
at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:704)
at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:106)
at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:528)
at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:704)
at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:106)
at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:528)
at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:786)
at SerializationTest.readObj(SerializationTest.java:39)
at SerializationTest.main(SerializationTest.java:27)
我曾希望可以序列化和反序列化该PrintWriter对象outObj,并且该对象的状态将保持不变,因此我仍然可以使用该反序列化的对象进行写入"Hello",该对象将被保存在缓冲区中。
有谁知道发生了什么事以及如何纠正此错误?
kryo java_使用Kryo序列化任意Java对象(获取IllegalAccessError)相关推荐
- kryoserializer java_使用Kryo序列化任意Java对象(获取IllegalAccess...
动机: 为了帮助进行远程调试(Java),能够请求远程服务器将任意对象发送到我的本地计算机进行检查很有用.但是,这意味着远程服务器必须能够序列化运行时预先未知的任意java对象. 所以我问了一下,偶然 ...
- java序列化深克隆_克隆可序列化和不可序列化的Java对象
java序列化深克隆 开发人员经常依靠3d方库来避免重新发明轮子,尤其是在Java世界中,Apache和Spring这样的项目如此盛行. 在处理这些框架时,我们通常很少或根本无法控制其类的行为. 这有 ...
- 克隆可序列化和不可序列化的Java对象
开发人员经常依靠3d方库来避免重新发明轮子,尤其是在Java世界中,Apache和Spring这样的项目如此盛行. 在处理这些框架时,我们通常很少或根本无法控制其类的行为. 这有时会导致问题. 例如, ...
- 【SpringBoot】34、SpringBoot整合Redis实现序列化存储Java对象
前面我们已经介绍过[SpringBoot]十七.SpringBoot 中整合 Redis,我们可以看出,在 SpringBoot 对 Redis 做了一系列的自动装配,使用还是非常方便的 一.背景 1 ...
- 罪恶都市洛杉矶java_「洛杉矶时间」Java代码获取美国洛杉矶的时间 - seo实验室...
洛杉矶时间 TimeZone time1 = TimeZone.getTimeZone("America/Los_Angeles"); Date today1 = calendar ...
- java byte序列化,java对象序列化byte[] and byte[]反序列化对象--转
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOExceptio ...
- 关于 Java 对象序列化您不知道的 5 件事
数年前,当和一个软件团队一起用 Java 语言编写一个应用程序时,我体会到比一般程序员多知道一点关于 Java 对象序列化的知识所带来的好处. 关于本系列 您觉得自己懂 Java 编程?事实上,大多数 ...
- java对象的序列化机制详解
Java对象的序列化机制 Java对象的序列化,是将内存中的java对象转化为二进制的字节流,然后保存到磁盘中或者在网络上.这就是序列化对象,反序列化顾名思义就是将对象的二进制字节流恢复成原来的对象. ...
- 【java基础,IO合集】文件流、高级流(缓冲流、对象流)、 序列化接口java.io.Serrializable
目录 文件流 1 块读写的文件复制操作 2 文件输出流-覆盖模式 3 文件输出流-追加模式 4 文件输出流-读取文本数据 高级流 1 流连接示意图 2 缓冲流 2.1 使用缓冲流完成文件复制操作 2 ...
- java 中文域名转码_转换java对象
数据解析 ●网络解析 Gson (一个Java序列化/反序列化库,可以将JSON和java对象互相转换) Jackson (Jackson可以轻松地将Java对象转换成json对象和xml文档,同样也 ...
最新文章
- DSVS7050签名服务器的网站,吉大正元数字签名服务器-安装部署手册(COM版 VCTK_S接口)2.1.1.doc...
- CRM 客户端程序开发:获取表单界面上各种字段的值及其他属性
- 小五:从个人用户无法注册.CN域名说起
- 腾讯云微计算实践:从Serverless说起,谈谈边缘计算的未来
- WebService(基于AXIS的WebService编程)
- 通过FILETIME得到时间
- 12c oracle 激活_Oracle 12C 安装教程
- NumPy进阶教程——超详细
- [Linux]如何读取Kernel cmdline
- 5G无线关键技术 — 高频段信号传输技术
- MySQL常用语句(二)
- 487计算机毕业设计
- Python——自动签到脚本
- @所有人 尊贵的所有微信用户,现邀您开通VIP会员等级功能!
- 全国计算机等级考试excel公式,全国计算机等级考试Excell公式大全
- 我们是一个团结、有力、强大的团队
- autohotkey 函数
- 关于Android Framework渲染机制,你需要学习哪些?
- mysql load escaped_MySQL load语句详细介绍
- 深度学习领域常用英文表达
热门文章
- 项目实战 - tpshop商城项目环境搭建
- 山西藏家捐献44幅明清寺观壁画在山西博物院展出(图)
- 计算机动漫与游戏制作要画画基础吗,动漫制作要有绘画基础吗
- 员工转正申请书_员工转正申请书优秀范文两篇
- 数据库练习题(比较基础)
- Google pixel 原生安卓出现 WiFi 网络受限、优化网速、网络无法连接问题
- 还贷款 月供贷款计算
- 微信jsapi支付流程
- 云账户合法吗_云支付合法吗?
- python语音识别 开源_DaCiDian是一个开源的中文普通话词汇,用于自动语音识别(ASR)...