2013-08-30 4 views
0

У меня есть сервер, который разбился (Minecraft, если вы хотите узнать), и некоторые ценные данные были сохранены в сериализованном объектном файле. Мне не удалось прочитать его с помощью ObjectInputStream Java. Это часть кода, которую я нашел в Интернете, немного отредактировал. Когда я читаю объект, он выдает исключение ClassNotFoundException.Чтение нестационарного сериализованного объекта в Java

//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) 

Edit: Я декомпилирован, и добавил все эти пакеты на мой ЦСИ. Успешно прочитайте объект. Но это НЕ ОТВЕТИТ ВОПРОС, вопрос остается: «как читать нечеткий сериализованный объект в Java».

+0

Пожалуйста, приложите полную ошибку стека ошибки. – Katona

+0

Если вы успешно прочитали объект, вы не получили исключение ClassNotFoundException, поэтому от вашего опроса ничего не осталось. – EJP

ответ

1

Вы можете использовать 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 для извлечения содержимого потока сериализации.

+0

readObject бросает java.lang.ClassNotFoundException. –

+0

Ну, когда вы написали _I удалось прочитать его с Javas ObjectInputStream_, я думал, что ошибки не было. Вы также должны включить сообщение об ошибке в свой вопрос. – Katona

+0

Я не заметил ошибку, потому что исходный код, который я использовал для проверки с использованием System.out.println для ошибки, заставил меня не знать, что произошла ошибка. –

1

API-интерфейс сериализации Java предполагает, что типы доступны при десериализации. На этом зависит design.

может может использовать Grammar for the Stream Format, чтобы написать собственный парсер для типов 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, он должен предоставить некоторую информацию как часть документации serialized form.

Смежные вопросы