目录
1. 序列化
(1) 序列化ObjectOutputStream
(2) 反序列化ObjectInputStream
2. 在TCP连接中的Socket使用
3. 常见报错
(1) java.io.StreamCorruptedException: invalid type code: AC
<1> 数据无法序列化
<2> 数据流混乱、损坏
<3> 类的UID不匹配
Object流常用于网络连接。ObjectInputStream和ObjectOutputStream可以直接传输任何类型数据,但请注意该类型数据需可进行序列化。
.writeObject( Object obj )
.readObject( )
开发中我们常需要将某个对象进行传输、存储;此时我们可以将这个自定义对象序列化。
把原本在内存中的对象状态 变成可存储或传输的过程称之为序列化。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
反序列化则是将可存储或传输的资源变成对象状态。
序列化只需要使自定义类实现接口,即 implements Serializable
class Hello implements Serializable {
//代码部分
}
Hello hello=new Hello();
ObjectOutputStream outputStream= new ObjectOutputStream(new FileOutputStream(getNewFile()));
outputStream.writeObject(hello);
outputStream.close();
class Hello implements Serializable {
//代码部分
}
ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream(getNewFile()));
Hello hello= (Hello) objectInputStream.readObject();
objectInputStream.close();
在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();
错误通常表明在尝试反序列化对象时,ObjectInputStream遇到了一个无效的类型码。
确保被序列化的对象是可序列化的。对象的类必须实现Serializable接口,否则ObjectOutputStream可能会遇到问题。
解决方法:使传输的数据的类实现Serializable接口。
使用getInputStream()方法和getOutputStream()方法socket获取Object输入流和Object输出流仅能有一次,多次获取会导致数据流混乱或损坏。
解决方法:复用获取到的输入流及输出流,不进行再次获取输入流及输出流。
当一个类被序列化时,自动会生成一个唯一的标识符(serialVersionUID)。如果接收方的类的 serialVersionUID与发送方的不同,就会导致无效类型码异常。
解决方法:可以通过在类中显式声明serialVersionUID来解决这个问题。
public class Data implements Serializable {
private static final long serialVersionUID = 123456789L;
// ... ...
}
tag: 序列化,反序列化,ObjectInputStream,ObjectOutputStream,Object流,Socket,ServerSocket,TCP,