Отправленный объект отличается от полученного объекта

В настоящее время я работаю над программой передачи файлов. Однако я столкнулся с серьезной проблемой. Сначала я задавался вопросом, почему, когда я получаю файлы на одном конце, он создает только пустой файл. Позже я узнал, что по какой-то причине объект, который я отправил, отличался от объекта, который я получил. Я отправил объект сообщения:

public class Message implements Serializable {


    private static final long serialVersionUID = 566740029496308507L;
    private HashMap<MType, Object> map = new HashMap<MType, Object>();

    public Message(MType id, Object value) {
        map.put(id, value);
    }
/* methods */

}

Используя внутреннюю HashMap, я сохранил такие значения, как байты файла.

        BufferedInputStream is = new BufferedInputStream(new FileInputStream(src));
        Message msg = new Message(MType.FILE_OPEN, true);
        com.transmit(msg);
        byte[] buf = new byte[Utility.bufferSize];
        msg = new Message(MType.FILE_NAME, src.getName());
        msg.setValue(MType.FILE_SIZE, Files.size(src.toPath()));
        com.transmit(msg);
        for (int count = is.read(buf); count > 0; count = is.read(buf)) {

            msg.setValue(MType.FILE_BYTE, buf);
            msg.setValue(MType.FILE_COUNT, count);
            com.transmit(msg);
            System.out.println("File part sent");

        }
        System.out.println("File sending complete");
        msg = new Message(MType.FILE_NAME, src.getName());
        msg.setValue(MType.FILE_SIZE, Files.size(src.toPath()));
        msg.setValue(MType.FILE_CLOSE, true);
        is.close();
        com.transmit(msg);

Где функция передачи напрямую записывает объект Message. Однако на принимающей стороне‹ я заметил несоответствие между отправленным сообщением и полученным сообщением. На принимающей стороне сообщения отправляются, но ни одна из их внутренних карт никогда не содержит значений FILE_BYTE и FILE_COUNT. Это как в цикле, он только отправляет значение «msg» перед циклом, не учитывая добавление новых значений. Я знаю это, потому что я сделал метод toString для сообщения, и вот как это выглядит:

Отправлено сообщение:

============================================
USERNAME {
  Bob
}
FILE_OPEN {
  true
}

============================================

============================================
FILE_NAME {
  logo.jpg
}
USERNAME {
  Bob
}
FILE_SIZE {
  27252
}

============================================

============================================
FILE_NAME {
  logo.jpg
}
USERNAME {
  Bob
}
FILE_COUNT {
  8192
}
FILE_BYTE {
  [B@5cea3875
}
FILE_SIZE {
  27252
}

============================================

============================================
FILE_NAME {
  logo.jpg
}
USERNAME {
  Bob
}
FILE_COUNT {
  8192
}
FILE_BYTE {
  [B@5cea3875
}
FILE_SIZE {
  27252
}

============================================

============================================
FILE_NAME {
  logo.jpg
}
USERNAME {
  Bob
}
FILE_COUNT {
  8192
}
FILE_BYTE {
  [B@5cea3875
}
FILE_SIZE {
  27252
}

============================================

============================================
FILE_NAME {
  logo.jpg
}
USERNAME {
  Bob
}
FILE_COUNT {
  2676
}
FILE_BYTE {
  [B@5cea3875
}
FILE_SIZE {
  27252
}

============================================

============================================
FILE_NAME {
  logo.jpg
}
USERNAME {
  Bob
}
FILE_CLOSE {
  true
}
FILE_SIZE {
  27252
}

============================================

Полученное сообщение:

============================================
USERNAME {
  Bob
}
FILE_OPEN {
  true
}

============================================

============================================
FILE_NAME {
  logo.jpg
}
USERNAME {
  Bob
}
FILE_SIZE {
  27252
}

============================================

============================================
FILE_NAME {
  logo.jpg
}
USERNAME {
  Bob
}
FILE_SIZE {
  27252
}

============================================

============================================
FILE_NAME {
  logo.jpg
}
USERNAME {
  Bob
}
FILE_SIZE {
  27252
}

============================================

============================================
FILE_NAME {
  logo.jpg
}
USERNAME {
  Bob
}
FILE_SIZE {
  27252
}

============================================

============================================
FILE_NAME {
  logo.jpg
}
USERNAME {
  Bob
}
FILE_SIZE {
  27252
}

============================================

============================================
FILE_NAME {
  logo.jpg
}
USERNAME {
  Bob
}
FILE_SIZE {
  27252
}
FILE_CLOSE {
  true
}

============================================

Если есть какой-либо другой код, который я должен опубликовать, пожалуйста, дайте мне знать. Спасибо :)


person Lexicographical    schedule 22.01.2016    source источник


Ответы (1)


Вам нужно использовать ObjectOutputStream.writeUnshared(), или ObjectOutputStream.reset() перед каждым writeObject(),, если вы хотите повторно передать один и тот же объект с изменениями. В противном случае отправляется только дескриптор исходного объекта.

Или создайте новый объект для отправки.

person user207421    schedule 22.01.2016