gpt4 book ai didi

java - 在Java中读取未知的序列化对象

转载 作者:行者123 更新时间:2023-12-02 06:47:05 25 4
gpt4 key购买 nike

我有一个崩溃的服务器(如果你想知道的话,我的世界),一些宝贵的数据被保存在序列化的对象文件中。我没有成功地用Java的ObjectInputStream读取它。这是我在网上找到的一段代码,稍微编辑了一下。当我读取该对象时,它抛出 ClassNotFoundException。

//Part of it
ObjectInputStream objStream = new ObjectInputStream(new FileInputStream(f));
Object obj = objStream.readObject();
System.out.println("The Object : "+ obj);
objStream.close();
System.out.println("Deserializing Operation Completly Successfully.");

问题是我根本不知道它的内容。我如何知道这个对象包含哪些字段和方法?

java.lang.ClassNotFoundException: net.****.****.****.**** //CENSORED
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:249)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:602)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1589)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1494)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1748)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1327)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:349)
at java.util.ArrayList.readObject(ArrayList.java:593)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:979)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1775)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1327)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:349)
at main.ReadFile.main(ReadFile.java:28)

编辑:我已经反编译了它,并将其所有包添加到我的 src 中。成功读取对象。但这并没有回答问题,问题仍然存在;“如何在 Java 中读取未知的序列化对象。”。

最佳答案

您可以使用Reflection然而,这并不是很方便。

但是,如果您知道反序列化后会出现什么类,那么您可以向下转换为特定类型。

在运行时查找对象的类可以这样完成:

Object obj = objStream.readObject();
Class<?> clazz = obj.getClass();
System.out.println(clazz.getName());

假设,如果打印 x.y.Person,那么您可以修改程序以使用该具体类:

import x.y.Person;

Person person = (Person) objStream.readObject();
System.out.println(person.getName());

如果这些类不可用,那么您可以尝试使用jdeserialize提取序列化流的内容。

关于java - 在Java中读取未知的序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18537508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com