Исключение ClassNotFoundException при чтении объекта из активов (Android)

#java #android #serialization #classnotfoundexception #objectinputstream

#java #Android #сериализация #исключение classnotfoundexception #objectinputstream

Вопрос:

У меня есть класс ‘Data’, который определяется следующим образом :

 public class Data implements Serializable{


    /**
     * 
     */
    private static final long serialVersionUID = 112358L;
    public int pagenumber;
    public int chapternumber;
    public int marks;


  public  Data(int pn, int c, int m) {

       chapternumber=c;
       pagenumber=pn;
       marks=m;
        } }
  

Я создал файл .brd (мой собственный тип файла) в NETBEANS для java в Windows следующим образом :

         fout=new FileOutputStream("Data.brd");
        oos=new ObjectOutputStream(fout);
        oos.writeObject(list);
  

Где list — это массив данных.

Я хочу прочитать этот файл из своего приложения для Android. итак, я создал точно такой же класс внутри своего пакета и сохранил Data.brd в папке с активами.

 ArrayList<Data> data = null; //object to be deserialized
InputStream is = null;
ObjectInputStream ois=null;
AssetManager assets = getAssets();
    is = assets.open("Data.brd");
        ois = new ObjectInputStream(is);
    data = (ArrayList<Data>) ois.readObject();
  

Но я получаю данные в виде пустого списка массивов.
Помимо этого, я получаю следующие исключения:

06-13 17:29:12.320: W / System.err(2180): java.lang.Исключение ClassNotFoundException: программное обеспечение.Данные 06-13 17:29:12.320: W / System.err(2180): на java.lang.Class.classForName(собственный метод) 06-13 17:29:12.324: W / System.err(2180): на java.lang.Class.forName(Class.java:217) 06-13 17:29:12.324: W/System.err(2180): в java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:2301) 06-13 17:29:12.324: W/System.err(2180): на java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1660) 06-13 17:29:12.324: W/System.err(2180): в java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:683) 06-13 17:29:12.324: W/System.ошибка (2180): приjava.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1803) 06-13 17:29:12.328: W/System.err(2180): в java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787) 06-13 17:29:12.328: W/System.ошибка (2180): в java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003) 06-13 17:29:12.328: W/System.err(2180): в java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960) 06-13 17:29:12.328: С системой.ошибка (2180): на java.утилита.ArrayList.readObject(ArrayList.java:657) 06-13 17:29:12.328: W/System.err(2180): в java.lang.reflect.Метод.вызывающий (собственный метод) 06-13 17:29:12.328: W / System.err(2180): в java.lang.reflect.Метод.invoke(Метод.java:511) 06-13 17:29:12.328: W/System.err(2180): в java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1354) 06-13 17:29:12.328: W/System.err(2180): на java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1266) 06-13 17:29:12.332: W/System.err(2180): в java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1855) 06-13 17:29:12.332: W/System.ошибка (2180): приjava.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787) 06-13 17:29:12.332: W/System.err(2180): в java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003) 06-13 17:29:12.332: W/System.ошибка (2180): в java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960) 06-13 17:29:12.332: W/System.err(2180): в com.mainpackage.MainActivity.onCreate(MainActivity.java:84) 06-13 17:29:12.332: W/System.err(2180): в android.app.Activity.performCreate(Activity.java:5008) 06-13 17:29:12.336: W / System.err(2180): в android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 06-13 17:29:12.336: W / System.err(2180): в android.app.ActivityThread.performLaunchActivity(ActivityThread.java: 2023) 06-13 17:29:12.336: W / System.err(2180): в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 06-13 17:29:12.336: W /System.err(2180): на android.app.ActivityThread.access 600 долларов США (ActivityThread.java:130) 06-13 17:29:12.336: W / System.err(2180): в android.app.ActivityThread $H.handleMessage(ActivityThread.java:1195) 06-13 17:29:12.336: W/System.err(2180): в android.os.Handler.DispatchMessage(Обработчик.java:99) 06-13 17:29:12.336: W/System.err(2180): в android.os.Looper.loop(Looper.java:137) 06-13 17:29:12.336: W/System.err(2180): в android.app.ActivityThread.main(ActivityThread.java:4745) 06-13 17:29:12.336: W/System.err(2180): в java.lang.reflect.Метод.вызывающий (собственный метод) 06-13 17:29:12.340: W / System.err(2180): в java.lang.reflect.Метод.invoke(Метод.java:511) 06-13 17:29:12.340: W/System.err(2180): в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 06-13 17:29:12.340: W/System.err(2180): в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 06-13 17:29:12.340:W /System.err(2180): в dalvik.system.NativeStart.main(собственный метод) 06-13 17:29:12.340: W /System.err(2180): вызвано: java.lang.Ошибка NoClassDefFoundError: программное обеспечение / данные 06-13 17:29:12.344: W /System.err(2180): … еще 33 06-13 17:29:12.344: W/System.err(2180): Вызвано: java.lang.Исключение ClassNotFoundException: программное обеспечение.Данные 06-13 17:29:12.344: W/System.err(2180): в dalvik.system.BaseDexClassLoader.FindClass(BaseDexClassLoader.java:61) 06-13 17:29:12.344: W/System.err(2180): на java.lang.ClassLoader.loadClass(ClassLoader.java:501) 06-13 17:29:12.344: W/System.err(2180): на java.lang.ClassLoader.loadClass(ClassLoader.java: 461)

что я делаю не так? Я использую Eclipse IDE для приложения Android.

Ответ №1:

Я понимаю, что вы создали данные класса в другом проекте. Вам нужно будет упаковать этот класс в jar и добавить его в путь сборки вашего проекта Android.

Если вы просто воссоздаете класс данных в своем Android-проекте, это не будет тот же класс, что и ClassLoader.

Комментарии:

1. но у меня есть Data.java внутри того же пакета, из которого был вызван этот код.

2. Находится ли это внутри пакета, называемого программным обеспечением? Потому что класс software. Данные не совпадают с somepackage.Data. В любом случае, я бы рекомендовал упаковать все классы, которые являются общими для проектов, в файл jar и добавить этот jar в путь сборки проектов, где эти классы необходимы.

3. «программное обеспечение» — это пакет, который я использовал в netbeans, но, как вы можете видеть, в моем объявлении данных нет упоминания о программном обеспечении (это весь код в Data). мое имя пакета com.mainpackage , и этот код вызывается MainActivity, и в Data.java также находится под тем жепакет

4. Полное имя класса определяется простым именем класса (Данные) и пакета, в котором он находится (программное обеспечение). При десериализации объекта класса software. У Java нет способа узнать, что класс теперь называется com.mainpackage.Data.

5. хорошо, вы были правы. Я экспортирую software.jar и это исключение больше не отображается. Спасибо!