繁体   English   中英

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

[英]Reading an unkown serialized object in Java

我有一个崩溃的服务器(如果你想知道我的Minecraft),一些珍贵的数据保存在序列化的目标文件中。 我没有用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());

让我们说,如果打印xyPerson ,那么你可以修改你的程序来使用那个具体的类:

import x.y.Person;

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

如果类不可用,则可以尝试使用jdeserialize来提取序列化流的内容。

Java的序列化API假定这些类型在反序列化时可用。 设计取决于此。

可以语法用于流格式 ,以便为API的类型编写自己的解析器。

在某些情况下,没有现场信息

例如,以下Serializable类型不提供任何字段元数据,其内部结构写为blockdata

public class ContrivedType implements Serializable {
  public String foo;
  public int bar;

  private void writeObject(java.io.ObjectOutputStream out) throws IOException {
    out.writeObject(foo);
    if (foo != null) {
      out.writeInt(bar);
    }
  }

  private void readObject(java.io.ObjectInputStream in) throws IOException,
      ClassNotFoundException {
    foo = (String) in.readObject();
    bar = foo != null ? in.readInt() : 0;
  }
}

类型数据的结构封装在类型本身中。

如果API有javadoc,它应该提供一些信息作为序列化表单文档的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM