0

クラッシュしたサーバーがあり (知りたい場合は 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 で未知のシリアル化されたオブジェクトを読み取る方法」という質問が残ります。

4

2 に答える 2

1

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 がある場合は、シリアル化された形式のドキュメントの一部としていくつかの情報を提供する必要があります。

于 2013-08-30T19:07:03.310 に答える