ObjectInputStream、ObjectOutputStream在TCP的使用

目录

1. 序列化

(1) 序列化ObjectOutputStream

(2) 反序列化ObjectInputStream

2. 在TCP连接中的Socket使用

3. 常见报错

(1) java.io.StreamCorruptedException: invalid type code: AC

<1>  数据无法序列化

<2>  数据流混乱、损坏

<3>  类的UID不匹配


Object流常用于网络连接。ObjectInputStream和ObjectOutputStream可以直接传输任何类型数据,但请注意该类型数据需可进行序列化

1. 序列化

.writeObject( Object obj )

.readObject( )

开发中我们常需要将某个对象进行传输、存储;此时我们可以将这个自定义对象序列化。

把原本在内存中的对象状态 变成可存储或传输的过程称之为序列化。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。

反序列化则是将可存储或传输的资源变成对象状态。

序列化只需要使自定义类实现接口,即 implements Serializable

(1) 序列化ObjectOutputStream

class Hello implements Serializable {
    //代码部分
}
 
Hello hello=new Hello();
ObjectOutputStream outputStream= new ObjectOutputStream(new FileOutputStream(getNewFile()));
outputStream.writeObject(hello);
outputStream.close();

(2) 反序列化ObjectInputStream

class Hello implements Serializable {
    //代码部分
}
 
ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream(getNewFile()));
Hello hello= (Hello) objectInputStream.readObject();
objectInputStream.close();

2. 在TCP连接中的Socket使用

在TCP连接中,可以通过Socket获取Object流。

请注意,使用getInputStream()方法和getOutputStream()方法socket获取输入流和输出流仅能有一次,多次获取会出现 java.io.StreamCorruptedException: invalid type code: AC 异常。错误通常表明在尝试反序列化对象时,ObjectInputStream遇到了一个无效的类型码。

//输出流
ObjectOutputStream out=new ObjectOutputStream(socket.getOutputStream());
out.writeObject( data )

//输入流
ObjectInputStream in=new ObjectInputStream(socket.getInputStream());
Data data = (Data) in.readObject();

3. 常见报错

(1) java.io.StreamCorruptedException: invalid type code: AC

错误通常表明在尝试反序列化对象时,ObjectInputStream遇到了一个无效的类型码。

<1>  数据无法序列化

确保被序列化的对象是可序列化的。对象的类必须实现Serializable接口,否则ObjectOutputStream可能会遇到问题。

解决方法:使传输的数据的类实现Serializable接口。

<2>  数据流混乱、损坏

使用getInputStream()方法和getOutputStream()方法socket获取Object输入流和Object输出流仅能有一次,多次获取会导致数据流混乱或损坏。

解决方法:复用获取到的输入流及输出流,不进行再次获取输入流及输出流。

<3>  类的UID不匹配

当一个类被序列化时,自动会生成一个唯一的标识符(serialVersionUID)。如果接收方的类的 serialVersionUID与发送方的不同,就会导致无效类型码异常。

解决方法:可以通过在类中显式声明serialVersionUID来解决这个问题。

public class Data implements Serializable {
    private static final long serialVersionUID = 123456789L;
    //  ... ...
}

tag: 序列化,反序列化,ObjectInputStream,ObjectOutputStream,Object流,Socket,ServerSocket,TCP,

相关推荐

  1. ObjectInputStream、ObjectOutputStreamTCP使用

    2024-01-08 09:44:02       30 阅读
  2. QT里使用TCP进行网络通信

    2024-01-08 09:44:02       10 阅读
  3. TCP网络通信-C#/Unity中知识点

    2024-01-08 09:44:02       22 阅读
  4. TCP_NODELAY延迟敏感场景下适合设置

    2024-01-08 09:44:02       11 阅读
  5. SQL中top使用

    2024-01-08 09:44:02       12 阅读
  6. uniapp使用tcp和udp区别和例子

    2024-01-08 09:44:02       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-08 09:44:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-08 09:44:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-08 09:44:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-08 09:44:02       20 阅读

热门阅读

  1. 数据结构:STL:vector

    2024-01-08 09:44:02       31 阅读
  2. Spring和Spring Boot的区别

    2024-01-08 09:44:02       38 阅读
  3. SWUSTOJ 133: 水王争霸

    2024-01-08 09:44:02       31 阅读
  4. Vim 快速指南:高效删除文本行

    2024-01-08 09:44:02       34 阅读
  5. 函数指针

    2024-01-08 09:44:02       34 阅读
  6. Sentinel

    Sentinel

    2024-01-08 09:44:02      31 阅读
  7. qt第三天快速回顾

    2024-01-08 09:44:02       41 阅读
  8. 【软件测试】学习笔记-如何做好测试计划

    2024-01-08 09:44:02       32 阅读
  9. 前端工程师的未来

    2024-01-08 09:44:02       30 阅读
  10. 微软开源.net core如何在linux系统搂钱?

    2024-01-08 09:44:02       32 阅读
  11. 10-单例模式(Singleton)

    2024-01-08 09:44:02       32 阅读
  12. C++动态内存

    2024-01-08 09:44:02       37 阅读
  13. Excel4:数据匹配与连接

    2024-01-08 09:44:02       31 阅读
  14. C语言基本语句介绍

    2024-01-08 09:44:02       34 阅读
  15. 如何判断服务器是否被入侵了

    2024-01-08 09:44:02       37 阅读
  16. Nacos和Eureka的全面对比

    2024-01-08 09:44:02       31 阅读