Я пытаюсь написать объект 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
Спасибо за ваш ответ, Grzesuav. Но сам AJPercentileAggregator содержит значение, которое я выполнил вычисления процентиля, он не должен пропускать сериализацию, потому что я буду пропускать его значение при отчете об экспорте. – scarework
Итак, класс AJPercentileAggregator должен быть виден во время десериализации, но это не так. Сериализуете ли вы использование старой версии JasperReports и десериализацию с использованием новой версии? – Grzesuav
Нет, я не знаю, Grzesuav. I сериализация и десериализация с использованием JasperReports (версия 3.7.4), мой отчет может просматривать, он может загружать объект AJPercentileAggregator при чтении Object из ObjectOutputStream. И когда я пытаюсь перейти на Jasper 5.0.1, он не смог загрузить объект AJPercentileAggregator. – scarework