ObjectInputStream、ObjectOutputStream在TCP的使用

目录

[1. 序列化](#1. 序列化)

[(1) 序列化ObjectOutputStream](#(1) 序列化ObjectOutputStream)

[(2) 反序列化ObjectInputStream](#(2) 反序列化ObjectInputStream)

[2. 在TCP连接中的Socket使用](#2. 在TCP连接中的Socket使用)

[3. 常见报错](#3. 常见报错)

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

[<1> 数据无法序列化](#<1> 数据无法序列化)

[<2> 数据流混乱、损坏](#<2> 数据流混乱、损坏)

[<3> 类的UID不匹配](#<3> 类的UID不匹配)


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

1. 序列化

**.writeObject(**Object obj )

.readObject( )

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

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

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

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

(1) 序列化ObjectOutputStream

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

(2) 反序列化ObjectInputStream

java 复制代码
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遇到了一个无效的类型码。

java 复制代码
//输出流
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来解决这个问题。

java 复制代码
public class Data implements Serializable {
    private static final long serialVersionUID = 123456789L;
    //  ... ...
}

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

相关推荐
宸津-代码粉碎机15 分钟前
AI攻防战升级!基于Spring AI构建Java应用自动免疫安全体系
java·大数据·开发语言·人工智能·python·安全·spring
2601_963749101 小时前
越华环保集团数字化污水治理:端边云采集架构与平台对接实现
java·大数据·架构
xcLeigh2 小时前
Go入门:整数类型的溢出与安全边界
java·安全·golang
源码宝2 小时前
SpringBoot+Vue2 诊所门诊管理系统,完整前后端源码,可直接部署上线
java·源码·his系统·门诊系统·程序代码·诊所系统·门诊his
yychen_java2 小时前
九:Text-to-SQL 智能数据查询与 Human-in-the-Loop 人机协作
java·人工智能·架构
Brilliantwxx3 小时前
【Linux】 进程(10) 进程控制深度解析:创建、终止与等待
linux·运维·服务器·c语言·开发语言·网络
ai小陈3 小时前
FramePack图生视频云端部署实战:从单图输入到视频输出的完整流程
服务器·人工智能·安全·ai·音视频·gpu算力
白狐_7983 小时前
408 计算机网络|TCP 可靠传输:ACK、重传、RTT、RTO
网络·tcp/ip·计算机网络
深念Y3 小时前
Lenovo XiaoXinAir 14 — 性能模式切换
前端·网络
欧米欧3 小时前
Linux基础指令上
linux·运维·服务器