Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-通过套接字发送序列化对象_Java_Sockets_Serialization - Fatal编程技术网

Java-通过套接字发送序列化对象

Java-通过套接字发送序列化对象,java,sockets,serialization,Java,Sockets,Serialization,我正在编写一个简单的多人战略游戏。因此,我有一个简单的连接类,它以字符串的形式发送不同类型的信息 消息的一种类型必须是具有游乐场当前信息的ArrayList 我的想法是将ArrayList序列化为一个字符串,然后在其前面设置一个简单的字符串标识符 问题是PrintWriter剪切消息,只发送部分消息 public void SendGameInfo(Unit [][] gameStatus){ ByteArrayOutputStream baos = new ByteArrayOutpu

我正在编写一个简单的多人战略游戏。因此,我有一个简单的连接类,它以字符串的形式发送不同类型的信息

消息的一种类型必须是具有游乐场当前信息的ArrayList

我的想法是将ArrayList序列化为一个字符串,然后在其前面设置一个简单的字符串标识符

问题是PrintWriter剪切消息,只发送部分消息

public void SendGameInfo(Unit [][] gameStatus){
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        ObjectOutputStream s = new ObjectOutputStream(baos);
        s.writeObject(gameStatus);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    writer.print("G: "+baos.toString());
    writer.flush();
}
以及我对PrintWriter的初始化:

try {
        socket = new Socket(IP_Adress,PORT);
        os = socket.getOutputStream();
        osw = new OutputStreamWriter(os);
        writer = new PrintWriter(osw);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

您不能盲目地将二进制文件转换为
字符串。您将得到无效的内容,即对编码无效的字节;然后它就坏了。用Base64编码。或者,最好不要使用
编写器
。使用
ObjectOutputStream
和方法。
Writer
用于字符数据,永远不要通过字符流发送原始字节。感谢您的快速回复。因此,我可以使用
ObjectOutputStream
首先写入标识符,然后使用
writeObject()
写入对象,然后刷新所有内容。如果我只需要发送字符串,我只需要使用
writeUTF()
?使用
OutputStream
来构造
ObjectOutputStream
并写入它。是的。发送一个
long
或任何id,然后发送有效负载
writeUTF
将比将
字符串作为
对象发送更有效。非常感谢:)您不能盲目地将二进制文件转换为
字符串。您将得到无效的内容,即对编码无效的字节;然后它就坏了。用Base64编码。或者,最好不要使用
编写器
。使用
ObjectOutputStream
和方法。
Writer
用于字符数据,永远不要通过字符流发送原始字节。感谢您的快速回复。因此,我可以使用
ObjectOutputStream
首先写入标识符,然后使用
writeObject()
写入对象,然后刷新所有内容。如果我只需要发送字符串,我只需要使用
writeUTF()
?使用
OutputStream
来构造
ObjectOutputStream
并写入它。是的。发送一个
long
或任何id,然后发送有效负载
writeUTF
将比将
字符串作为
对象发送更有效。非常感谢:)