【问题标题】:Object sent differs from object received发送的对象与接收的对象不同
【发布时间】:2016-01-22 15:55:09
【问题描述】:

我目前正在开发一个文件传输程序。但是,我面临一个重大问题。一开始我想知道为什么当我在一端收到文件时,它只会创建一个空文件。后来我发现由于某种原因,我发送的对象与我收到的对象不同。 我发送了一个 Message 对象:

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);

其中传输函数直接写入消息对象。但是,在接收端

发送消息:

============================================
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
}

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

如果我应该发布任何其他代码,请告诉我。谢谢:)

【问题讨论】:

    标签: java objectinputstream objectoutputstream


    【解决方案1】:

    如果要重新传输具有更改的相同对象,则需要在每个 writeObject(), 之前使用 ObjectOutputStream.writeUnshared(),ObjectOutputStream.reset()。否则只会发送原始对象的句柄。

    或者每次发送创建一个新对象。

    【讨论】:

      猜你喜欢
      • 2017-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多