2016-11-08 2 views
2

У меня есть класс, где храню информацию о файлах (путь и т. Д.). Я только сериализую класс, когда хочу отправить файлы и другую информацию другому Лицу.Пользовательская сериализация класса не работает

Там у меня проблема с файлами размером более 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(); 

Есть ли что-то очевидно, что я не узнал? Я не получаю сообщение об ошибке или что-то в этом роде. Единственный способ заметить, что целевое изображение недействительно.

+0

Мне кажется странным, что вы читаете файл в '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

+0

Это просто класс, чтобы показать, как я получаю проблему - все, что касается нулевого и т. Д., Не является importamt на данный момент, потому что это единственный пример, чтобы воспроизвести его. То же самое и для того, чтобы не проверять возвращаемое значение чтения. Конечно, я делаю это в своем «реальном» классе. Я проверю пункт writeObject, как только я снова нахожусь на своей машине. – Agyss

+0

Вы должны закрыть поток oos, прежде чем пытаться его прочитать, и он не может быть уже сброшен на диск. –

ответ

0

Как заявил Роберт в комментариях по поводу вопроса, writeObject всегда должен использоваться при работе с ObjectOutputStream. Также write (byte [] data) будет acceppt байтового массива. То же самое верно для чтения с readObject и чтения.

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