2014-10-22 3 views
0

Я пытаюсь написать объект JRVirtualPrintPage в OutputStream, чтобы передать его в файл персистентности.Класс ошибки не найден, когда readObject из InputStream

Но когда я прочитал из InputStream, я не мог загрузить класс, который я определил, когда выполнить процентиль расчет

Мой код в поле ниже:

private void writePages() throws IOException, JRException { 

OutputStream pos = new OutputStream(); 
    ObjectOutputStream oos = new ObjectOutputStream(pos); 

    List pages = print.getPages(); 

    numPages = pages == null ? 0 : pages.size(); 
    writeInt(numPages); 

    pageFilePointers = new long[pages.size()]; 
    long pfpOffset = writeObject(pageFilePointers); 


    for(int i = 0; i < numPages; i++) { 
     if (interrupted) 
      return; 

     if (Thread.currentThread().isInterrupted()) { 
      throw new JRException("Current thread interrupted."); 
     } 

     JRVirtualPrintPage vpage = (JRVirtualPrintPage)pages.get(i); 

     oos.writeObject(vpage); 


     for (JRPrintElement jrPrintElement : elements) { 
      oos.writeObject(jrPrintElement); 
     } 

     pageFilePointers[i] = writeBytes(pos.getBytes()); 
    } 

    long saveFP = file.getFilePointer(); 
    file.seek(pfpOffset); 
    writeObject(pageFilePointers); 
    file.seek(saveFP); 
} 

private void readPages() throws IOException, ClassNotFoundException { 
    int numPages = readInt(); 
    pageFilePointers = (long[])readObject(); 

    AJPersistenceInputStream pis = new AJPersistenceInputStream(); 
    file.seek(pageFilePointers[0]); 
    byte[] pageBytes = readBytes(); 
    pis.reset(pageBytes); 
    ObjectInputStream ois = new ObjectInputStream(pis); 

    JRVirtualPrintPage page = (JRVirtualPrintPage)ois.readObject(); 

    if (startIndex == endIndex) { 
     for(int i=1; i<=startIndex; i++) 
      page = getPrintPage(pis, ois, i); 
     print.addPage(page); 
    } else { 
     endIndex = Math.min(endIndex, pageFilePointers.length-1); 

     for(int i=0; i<=endIndex; i++) { 
      if (i>0) // else already read page index == 0 
       page = getPrintPage(pis, ois, i); 
      if (i >= startIndex) 
       print.addPage(page); 
     } 
    } 
} 

я получил ошибку в ниже:

java.lang.ClassNotFoundException: com.alu.vital.vq.jasper.aggregation.AJPercentileAggregator 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:270) 
    at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:623) 
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1610) 
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1515) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348) 
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1989) 
    at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:499) 
    at net.sf.jasperreports.engine.fill.JRTemplatePrintText.readObject(JRTemplatePrintText.java:91) 

Класс com.alu.vital.vq.jasper.aggregation.AJPercentileAggregator - это класс, который я определил для вычисления процентиля. Он был скомпилирован при составлении отчета.

Почему я использую объект JRVirtualPrintPage для записи в OutputStream, а при чтении из InputStream я также бросаю объект в тип JRVirtualPrintPage, почему возникает это исключение?

Пожалуйста, помогите мне объяснить более подробно об этом. И как я могу это исправить? Я думаю, что это relave к новому механизму виртуализации, потому что эта проблема возникает только при обновлении JasperReports от 3.7.4 до 5.0.1

ответ

0

Ответа в строках

в java.io.ObjectInputStream.defaultReadFields (ObjectInputStream.java:1989)

на java.io.ObjectInputStream.defaultReadObject (ObjectInputStream.java:499)

от нижней части трассировки стека.

Кажется, что ваш класс JRVirtualPrintPage имеет поле типа AJPercentileAggregator. Поэтому, когда вы выполняете сериализацию JRVirtualPrintPage, сериализуете все свои поля, таким образом, AJPercentileAggregator.

Вы можете:

  1. Написать обычай сериализатору в JRVirtualPrintPage, который пропускает поле типа AJPercentileAggregator.

  2. Отметить поле как преходящие, который пропускает его от сериализации

+0

Спасибо за ваш ответ, Grzesuav. Но сам AJPercentileAggregator содержит значение, которое я выполнил вычисления процентиля, он не должен пропускать сериализацию, потому что я буду пропускать его значение при отчете об экспорте. – scarework

+0

Итак, класс AJPercentileAggregator должен быть виден во время десериализации, но это не так. Сериализуете ли вы использование старой версии JasperReports и десериализацию с использованием новой версии? – Grzesuav

+0

Нет, я не знаю, Grzesuav. I сериализация и десериализация с использованием JasperReports (версия 3.7.4), мой отчет может просматривать, он может загружать объект AJPercentileAggregator при чтении Object из ObjectOutputStream. И когда я пытаюсь перейти на Jasper 5.0.1, он не смог загрузить объект AJPercentileAggregator. – scarework