У меня есть класс, где храню информацию о файлах (путь и т. Д.). Я только сериализую класс, когда хочу отправить файлы и другую информацию другому Лицу.Пользовательская сериализация класса не работает
Там у меня проблема с файлами размером более 1019 байт: они не сохранены правильно.
я смог воссоздать этот вопрос с этим примером класса:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class SerializableImage implements Serializable{
private static final long serialVersionUID = -2079629440538093893L;
private String path;
private byte[] data;
public SerializableImage()
{}
public SerializableImage(String path) {
this.path = path;
}
public byte[] getData() {
return data;
}
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
int imageSize = ois.readInt();
data = new byte[imageSize];
ois.read(data);
}
private void writeObject(ObjectOutputStream oos) throws IOException {
int imageSize;
File file = new File(path);
imageSize = (int) file.length();
oos.writeInt(imageSize);
InputStream is = null;
byte[] buffer = new byte[imageSize];
try {
is = new FileInputStream(file);
is.read(buffer);
} finally {
if (is != null) {
is.close();
}
}
oos.write(buffer);
}
}
Атрибут IMAGESIZE записывается правильный путь, а также байты считываются в буфер правильный путь (сравнил его «клон файла «с помощью только FileInputStream и FileOutputStream, поэтому я знаю, что информация, записанная в массив байтовых буферов, верна).
Вопрос сейчас: Есть ли проблема с oos.write (buffer)? Или проблема в ois.read (data)? imageSize написано/прочитано правильно.
Я всегда получал неправильные значения в массиве байт данных, начиная с индексом 1020.
I «испытанными» этот класс с этим кодом:
SerializableImage sourceImage = new SerializableImage("C:\\\\source.jpg");
File serializableData = new File("C:\\\\data.data");
File targetImage = new File("C:\\\\target.jpg");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(serializableData));
oos.writeObject(sourceImage);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(serializableData));
sourceImage = (SerializableImage) ois.readObject();
FileOutputStream imageOutputStream = new FileOutputStream(targetImage);
byte[] data = sourceImage.getData();
imageOutputStream.write(data);
imageOutputStream.flush();
ois.close();
oos.close();
imageOutputStream.close();
Есть ли что-то очевидно, что я не узнал? Я не получаю сообщение об ошибке или что-то в этом роде. Единственный способ заметить, что целевое изображение недействительно.
Мне кажется странным, что вы читаете файл в 'writeObject', особенно учитывая, что у вас есть конструктор no-arg, а' path' может быть 'null'. Вы также не проверяете возвращаемое значение из 'read'. https://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html говорит: «Любой объект, включая строки и массивы, записывается с помощью writeObject». - Вы пробовали readObject' и 'writeObject' вместо простых методов' read' и 'write'? И почему даже есть свои методы 'readObject' и' writeObject'? – Robert
Это просто класс, чтобы показать, как я получаю проблему - все, что касается нулевого и т. Д., Не является importamt на данный момент, потому что это единственный пример, чтобы воспроизвести его. То же самое и для того, чтобы не проверять возвращаемое значение чтения. Конечно, я делаю это в своем «реальном» классе. Я проверю пункт writeObject, как только я снова нахожусь на своей машине. – Agyss
Вы должны закрыть поток oos, прежде чем пытаться его прочитать, и он не может быть уже сброшен на диск. –