Java:序列化

什么是Java对象序列化

1.永久性保存对象,保存对象的字节序列到本地文件中;

2.通过序列化对象在网络中传递对象;

3.通过序列化在进程间传递对象。

注意

1.被序列化的类必须实现java.io.Serializable接口

2.在序列化过程能中不要改变数据的状态 <可以序列化非线程安全的类,但在序列化过程中这个类必须是线程安全的>:

   之前遇到过EOFException这个异常,是在读取序列化文件的时候抛出来的,网上找贴回答都是意外结尾,意外开头,什么结尾追加输出null,扯了一大堆,看的我也是醉了。

    想吐槽的就是,序列化接口是人家给的,输出接口也是人家给的,抛异常肯定就是序列化过程中输出数据出了问题,丫在结尾加个null怎么就管用了。

    最后发现是我在序列化一个MAP的时候还在往这个MAP里面put数据,导致序列化文件的时候数据出了问题,读取的时候抛了异常。

    <序列化接口具体的后代代码我也没看,来个高人帮忙分析分析?>

贴代码:

   #进程间通信 <流写到其他机器上去就是网络中传递对象,写到本地磁盘就是序列化到本地>

   

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
class Client1 {
public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
Socket s = new Socket("localhost", 30000);
ObjectInputStream in = new ObjectInputStream(s.getInputStream());
try {
Map<String, MyClass1> data = (Map)in.readObject();
int i=1;
for(Entry<String, MyClass1> e:data.entrySet())
{
System.out.println("反序列化第"+i+++"对象:");
System.out.println(e.getKey()+":"+e.getValue().getAge()+","+e.getValue().getWeight());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}

public class Server {
public static void main(String[] args) throws IOException{
ServerSocket srv = new ServerSocket(30000);//port
while(true) {
Socket s = srv.accept();
//创建一个对象输出流
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
//要发送到client的Map对象
Map<String, MyClass1> data = new HashMap<String, MyClass1>();
for(int i=0;i<1000;i++)
{ MyClass1 c =new MyClass1(i,i);
data.put("编号:"+i, c);
}
out.writeObject(data);
out.flush();
out.close();
//同时输出到文件
FileOutputStream fos = new FileOutputStream("catDemo.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(data);
oos.close();
}
}
}
//自定义对象, 必须实现可序列化接口
class MyClass1 implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private int weight;
private int age;

public MyClass1(int weight, int age){
setWeight(weight);
setAge(age);
}

public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

你可能感兴趣的:(java)